Volgens afspraak vertegenwoordigt EF6 de één-op-één relaties met behulp van de zogenaamde Associatie gedeelde primaire sleutel , waarbij de PK van de afhankelijke entiteit ook dient als FK voor de hoofdentiteit.
In uw geval beschouwt het Account.Id
om de FK te zijn voor Customer
, en aangezien het automatisch wordt gegenereerd, krijg je de betreffende uitzondering.
Het bijkomende probleem is dat EF6 geen één-op-één-relatie met expliciete FK-eigenschap ondersteunt (er is geen HasForeignKey
vloeiende API vergelijkbaar met een-op-veel-relaties).
U moet dus de AccountId
. verwijderen eigenschap uit het model en laat alleen de eigenschap navigatie. Ook, hoewel niet strikt noodzakelijk, zou het goed zijn om de naamgevingsconventies te volgen en het gewoon Account
te noemen. in plaats van AccountValue
.
Met andere woorden, vervang
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
met
public virtual Customer Customer { get; set; }
De naam van de FK-kolom kan worden opgegeven met de MapKey
vloeiende API:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
En je bent klaar.
Nu voegt het volgende correct eerst een nieuwe Customer
in en dan een nieuw Account
ernaar verwijzen:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();