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?
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
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. –