在我的數據庫中,我有兩個表tblOrders
和tblPayments
,它們都包含一個名爲ReferenceNumber (varchar 50)
的屬性。不幸的是,tblPayments
沒有指向tblOrders
的外鍵,因此將這兩個表中的記錄放入關係的唯一方法是參照匹配的ReferenceNumber
(1個訂單可以有n筆付款)。如何設置沒有(整數)外鍵的兩個實體之間的關係?
在我使用Entity Framework Core的ASP.NET Core 1.1應用程序中,我試圖爲兩個模型Order.cs
和Payment.cs
定義這種關係。
在相關配置文件,我想將它們設置爲以下幾點:
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");
}
當我調試應用程序,我獲得以下例外:
System.InvalidOperationException:'從'Payment.Order'到具有外鍵屬性{'ReferenceNumber':string}的'Order.Payments'的關係無法定位主鍵{'Id':int},因爲它不兼容。爲此關係配置主鍵或一組兼容外鍵屬性。'
這聽起來很合理,但我怎麼能考慮上面提到的情況正確設置關係?
是的,我正在使用現有的數據庫。我必須理清是否有可能向tblPayments添加外鍵,但由於已經依賴於此數據庫的應用程序的複雜性,我很悲觀 – Dario
只要始終存在一對一的關聯在兩個表上的引用號之間,添加一個外鍵對它之前建立的任何應用程序應該沒有影響。問題是如果它被設置爲空,設置爲被引用表中不存在的內容,或者主體方(可能是訂單)被刪除而沒有刪除相關的支付。 –