2017-06-30 123 views
0

在我的數據庫中,我有兩個表tblOrderstblPayments,它們都包含一個名爲ReferenceNumber (varchar 50)的屬性。不幸的是,tblPayments沒有指向tblOrders的外鍵,因此將這兩個表中的記錄放入關係的唯一方法是參照匹配的ReferenceNumber(1個訂單可以有n筆付款)。如何設置沒有(整數)外鍵的兩個實體之間的關係?

在我使用Entity Framework Core的ASP.NET Core 1.1應用程序中,我試圖爲兩個模型Order.csPayment.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},因爲它不兼容。爲此關係配置主鍵或一組兼容外鍵屬性。'

這聽起來很合理,但我怎麼能考慮上面提到的情況正確設置關係?

回答

2

你不能兩面都有。看起來你正在使用一個現有的數據庫,它實際上沒有外鍵。你不能簡單地告訴EF假裝有一個。您可能需要更改該數據庫以使其具有適當的外鍵,或者您需要放棄關係的EF建模並手動查詢相關實體。例如,要得到一個特定的順序支付:

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

取而代之的是更容易order.Payments,這就需要外鍵。

+0

是的,我正在使用現有的數據庫。我必須理清是否有可能向tblPayments添加外鍵,但由於已經依賴於此數據庫的應用程序的複雜性,我很悲觀 – Dario

+0

只要始終存在一對一的關聯在兩個表上的引用號之間,添加一個外鍵對它之前建立的任何應用程序應該沒有影響。問題是如果它被設置爲空,設置爲被引用表中不存在的內容,或者主體方(可能是訂單)被刪除而沒有刪除相關的支付。 –

相關問題