Per Konvention repräsentiert EF6 die Eins-zu-eins-Beziehungen unter Verwendung des sogenannten Verknüpfung des gemeinsamen Primärschlüssels , wobei die PK der abhängigen Entität auch als FK für die Hauptentität dient.
In Ihrem Fall wird Account.Id
berücksichtigt der FK für Customer
zu sein , und da es automatisch generiert wird, erhalten Sie die betreffende Ausnahme.
Das zusätzliche Problem besteht darin, dass EF6 keine Eins-zu-eins-Beziehung mit expliziter FK-Eigenschaft unterstützt (es gibt keinen HasForeignKey
Fluent API ähnlich 1:n-Beziehungen).
Sie müssen also die AccountId
entfernen -Eigenschaft aus dem Modell und belassen Sie nur die Navigationseigenschaft. Auch wenn es nicht unbedingt erforderlich ist, wäre es gut, den Namenskonventionen zu folgen und es einfach Account
zu nennen statt AccountValue
.
Mit anderen Worten, ersetzen Sie
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
mit
public virtual Customer Customer { get; set; }
Der FK-Spaltenname kann mit dem MapKey
angegeben werden Fließende API:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
Und Sie sind fertig.
Das Folgende fügt nun korrekterweise zuerst einen neuen Customer
ein und dann ein neues Account
darauf verweisen:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();