Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Entity Framework — jeden do jednego — ReferentialConstraint jest mapowany na kolumnę wygenerowaną przez sklep

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL do grupowania według dnia

  2. Partycjonowana tabela sprawdzania serwera SQL

  3. Zapytanie SQL dla tabeli drzewa

  4. Łączenie dwóch tabel za pomocą SQL

  5. Zaplanuj zadanie SQL w skonfigurowanych przez użytkownika przedziałach czasowych codziennie