Efter konvention repræsenterer EF6 en-til-en-relationerne ved hjælp af den såkaldte Shared Primary Key Association , hvor den afhængige enheds PK også tjener som FK for hovedenheden.
I dit tilfælde betragter den Account.Id
at være FK til Customer
, og da det er automatisk genereret, får du den pågældende undtagelse.
Det yderligere problem er, at EF6 ikke understøtter et-til-en-forhold med eksplicit FK-egenskab (der er ingen HasForeignKey
flydende API, der ligner en-til-mange-forhold).
Så du skal fjerne AccountId
egenskab fra modellen og lad kun navigationsegenskaben stå. Også selvom det ikke er stærkt nødvendigt, ville det være godt at følge navnekonventionerne og bare kalde det Account
i stedet for AccountValue
.
Med andre ord, udskift
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
med
public virtual Customer Customer { get; set; }
FK-kolonnenavnet kan angives ved hjælp af MapKey
flydende API:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
Og du er færdig.
Nu indsætter følgende korrekt først en ny Customer
og derefter en ny Account
henviser til det:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();