Zgodnie z konwencją EF6 reprezentuje relacje jeden do jednego przy użyciu tak zwanego Powiązanie współdzielonego klucza podstawowego , gdzie PK podmiotu zależnego służy również jako FK podmiotu głównego.
W twoim przypadku uwzględnia Account.Id
być FK dla Customer
, a ponieważ jest generowany automatycznie, otrzymujesz kwestionowany wyjątek.
Dodatkowym problemem jest to, że EF6 nie obsługuje relacji jeden do jednego z jawną właściwością FK (nie ma HasForeignKey
płynny interfejs API podobny do relacji jeden-do-wielu).
Musisz więc usunąć AccountId
z modelu i pozostaw tylko właściwość nawigacji. Ponadto, chociaż nie jest to konieczne, dobrze byłoby przestrzegać konwencji nazewnictwa i po prostu nazwać to Account
zamiast AccountValue
.
Innymi słowy, zamień
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
z
public virtual Customer Customer { get; set; }
Nazwę kolumny FK można określić za pomocą MapKey
płynny interfejs API:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
I gotowe.
Teraz poniższe poprawnie wstawia najpierw nowego Customer
a następnie nowe Account
odwołując się do niego:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();