Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entity Framework – One-to-One – ReferentialConstraint wird einer vom Store generierten Spalte zugeordnet

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();