Doing Entity Framework (5) code first, although we are not generating our data model from the code–we just keep them in sync manually (less of a pain than it sounds).
Trying to create a 1 to 0-1 relationship. Here is the setup using a made-up example of a customer that could have 0 or 1 address:
Edit: original example was not right. Customer can have 0-1 Addresses, Address has exactly 1 customer. Table design and code both updated.
Address -------------- AddressId (identity) AddressText CustomerId (Edit: this employs a unique constraint)
Customer -------------- CustomerId (identity) CustomerName
Relevant part of Address mapping:
this.HasKey(t => t.AddressId);
//SEE NOTE ON THIS BELOW
//this.Property(t =>t.AddressId).
HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.HasRequired(t => t.Customer)
.WithOptional();
Relevant part of Customer mapping:
this.HasKey(t => t.CustomerId);
this.HasOptional(b => b.Address)
.WithRequired();
Note the line commented out in Customer. If I include this, I get the following error:
A dependent property in a ReferentialConstraint is mapped to a
store-generated column. Column: ‘CustomerId’.
If I don’t include it, I get:
Cannot insert explicit value for identity column in table ‘Customer’
when IDENTITY_INSERT is set to OFF.
I have searched high and low, and the code above seems to be the recommended approach. I have also seen some vague mention that 1:1 relationships can’t be modeled unless the two tables share a key of the same name?
Can this sort of relationship be modeled in code, and if so, what is the correct syntax?
Your mapping looks invalid. You are saying that an
Addresshas an optionalCustomer, and aCustomerhas a required address, but yourAddressforiegn key on yourCustomerentity is nullable, so the relationship should be the other way around.Also, yes, if you want to model a 1 to 1 relationship, then you should have a
Customertable with a primary key, and then anAddresstable with a primary key column which is also a foreign key to yourCustomertable.Otherwise, you are really modelling a one-to-many relationship in the database.