Podle konvence EF6 představuje vztahy jedna ku jedné pomocí takzvaného Přidružení sdíleného primárního klíče , kde PK závislé osoby slouží zároveň jako FK hlavní osobě.
Ve vašem případě bere v úvahu Account.Id
být FK pro Customer
, a protože se generuje automaticky, dostanete dotyčnou výjimku.
Dalším problémem je, že EF6 nepodporuje vztah jedna ku jedné s explicitní vlastností FK (neexistuje žádný HasForeignKey
plynulé API podobné vztahům one-to-many).
Musíte tedy odstranit AccountId
vlastnost z modelu a ponechat pouze vlastnost navigace. Také, i když to není nezbytně nutné, bylo by dobré dodržovat konvence pojmenování a nazvat to Account
spíše než AccountValue
.
Jinými slovy nahradit
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
s
public virtual Customer Customer { get; set; }
Název sloupce FK lze zadat pomocí MapKey
plynulé API:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
A máte hotovo.
Nyní následující správně nejprve vloží nový Customer
a poté nový Account
odkazující na to:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();