Enligt konvention representerar EF6 en-till-en-relationerna med den så kallade Shared Primary Key Association , där PK för den beroende enheten också fungerar som FK till huvudenheten.
I ditt fall överväger den Account.Id
att vara FK till Customer
, och eftersom det är automatiskt genererat får du undantaget i fråga.
Det ytterligare problemet är att EF6 inte stöder en-till-en-relation med explicit FK-egenskap (det finns ingen HasForeignKey
flytande API som liknar en-till-många-relationer).
Så du måste ta bort AccountId
egenskapen från modellen och lämna endast navigeringsegenskapen. Även om det inte är absolut nödvändigt, skulle det vara bra att följa namnkonventionerna och bara kalla det Account
istället för AccountValue
.
Med andra ord, ersätt
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
med
public virtual Customer Customer { get; set; }
FK-kolumnnamnet kan anges med MapKey
flytande API:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
Och du är klar.
Nu infogar följande korrekt först en ny Customer
och sedan ett nytt Account
hänvisar till det:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();