2017-06-30 5 views
0

In meiner Datenbank habe ich die beiden Tabellen tblOrders und tblPayments, die beide eine Eigenschaft mit dem Namen ReferenceNumber (varchar 50) enthalten. Leider hat tblPayments keinen Fremdschlüssel, der auf tblOrders zeigt, also ist die einzige Möglichkeit, die Datensätze aus diesen beiden Tabellen in Beziehung zu setzen, indem auf die übereinstimmende ReferenceNumber verwiesen wird (1 Auftrag kann n Zahlungen haben). In meiner ASP.NET Core 1.1-Anwendung, die Entity Framework Core verwendet, versuche ich, diese Beziehung für zwei Modelle Order.cs und Payment.cs zu definieren.Wie legen Sie eine Beziehung zwischen zwei Entitäten fest, die keinen (ganzzahligen) Fremdschlüssel haben?

In den zugehörigen Konfigurationsdateien habe ich versucht, sie einzurichten, wie folgend:

OrderConfiguration.cs:

public void Map(EntityTypeBuilder<Order> builder) 
    { 
     builder.HasKey(m => m.Id); 

     builder.Property(m => m.Id).HasColumnName("ID"); 
     ... several other mappings... 

     builder.HasMany(m => m.Payments).WithOne(p => p.Order).HasForeignKey(m => m.ReferenceNumber); 


     builder.ToTable("tblOrders"); 
    } 

PaymentConfiguration.cs:

public void Map(EntityTypeBuilder<Payment> modelBuilder) 
    { 
     modelBuilder.HasKey(m => m.Id); 

     modelBuilder.Property(m => m.Id).HasColumnName("ID"); 
     ... several other mappings... 

     modelBuilder.HasOne(m => m.Order).WithMany(o => o.Payments).HasForeignKey(m => m.ReferenceNumber); 

     modelBuilder.ToTable("tblPayments"); 
    } 

, wenn ich die Anwendung debuggen, Ich erhalte die folgende Ausnahme:

System.InvalidOperationException: 'Die Beziehung von' Payment.Order 'zu' Order.Payments 'mit Fremdschlüsseleigenschaften {' ReferenceNumber ': string} kann nicht auf den Primärschlüssel {' Id ': int} abzielen, da dieser nicht kompatibel ist. Konfigurieren Sie einen Hauptschlüssel oder eine Gruppe kompatibler Fremdschlüsseleigenschaften für diese Beziehung. '

Das klingt ziemlich vernünftig, aber wie kann ich die Beziehung unter Berücksichtigung der oben genannten Situation richtig einstellen?

Antwort

2

Sie können nicht beides haben. Es scheint, dass Sie eine vorhandene Datenbank verwenden, die buchstäblich keinen Fremdschlüssel hat. Du kannst EF nicht einfach so tun, als ob es einen gibt. Sie müssen diese Datenbank entweder ändern, damit sie über einen geeigneten Fremdschlüssel verfügt, oder Sie müssen auf die EF-Modellierung der Beziehung verzichten und die zugehörigen Entitäten manuell abfragen. Um zum Beispiel die Zahlungen für einen bestimmten Auftrag zu erhalten:

var payments = db.Payments.Where(m => m.ReferenceNumber == order.ReferenceNumber); 

Statt der leichten order.Payments, die den Fremdschlüssel erfordert.

+0

Ja, ich verwende eine vorhandene Datenbank. Ich muss herausfinden, ob es eine Möglichkeit gibt, TblPayments einen Fremdschlüssel hinzuzufügen, aber ich bin pessimistisch aufgrund der Komplexität der Anwendungen, die bereits auf diese Datenbank angewiesen sind. – Dario

+0

Solange es immer eine Eins-zu-eins-Korrelation gibt Zwischen der Referenznummer in beiden Tabellen sollte das Hinzufügen eines Fremdschlüssels keine Auswirkung auf eine Anwendung haben, die vor dem Erstellen erstellt wurde. Das Problem wäre, wenn es auf null gesetzt ist, auf etwas gesetzt ist, das nicht in der referenzierten Tabelle existiert, oder die Hauptseite (wahrscheinlich Aufträge) wird jemals gelöscht, ohne auch verwandte Zahlungen zu löschen. –

Verwandte Themen