2017-06-30 4 views
0

私のデータベースにはという名前の2つのテーブルtblOrderstblPaymentsがあります。残念ながらtblPaymentsにはtblOrdersを指す外部キーがないので、これらの2つのテーブルからのレコードを関係に置く唯一の方法は、一致するReferenceNumber(1回の支払いでn回の支払いが可能)を参照することです。(整数)外部キーを持たない2つのエンティティ間の関係を設定するにはどうすればよいですか?

エンティティフレームワークコアを使用するASP.NET Core 1.1アプリケーションでは、このモデルを2つのモデル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: '外部キープロパティ{' ReferenceNumber ':string}を持つ' Payment.Order 'から' Order.Payments 'への関係が互換性がないため、主キー{' Id ':int}をターゲットできません。この関係のプリンシパルキーまたは互換性のある外部キープロパティのセットを構成します。

これはかなり妥当ですが、上記の状況を考慮して適切な関係を設定するにはどうすればよいですか?

答えて

2

あなたは両方の方法をとることはできません。文字通り、外部キーを持たない既存のデータベースを使用しているようです。まるでEFにあるかのようにEFに告げることはできません。適切な外部キーを持つようにデータベースを変更するか、関係のEFモデリングを不要にして、関連するエンティティを手動で照会するだけです。

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

代わりorder.Paymentsより簡単に、外部キーが必要です。たとえば、特定の順序のための支払いを取得します。

+0

ええ、私は既存のデータベースを使用しています。私は、tblPaymentsに外部キーを追加する可能性がある場合はソートする必要がありますが、私はすでにこのデータベースに依存しているアプリケーションの複雑さのために悲観的です – Dario

+0

常に1対1の相関がある限り両方のテーブルの参照番号の間に、外部キーを追加することは、そこに存在する前に構築されたアプリケーションには影響しません。問題が、nullとして設定されているか、参照されているテーブルに存在しないものに設定されているか、プリンシパル側(おそらく注文)が関連する支払いを削除せずに削除された場合です。 –

関連する問題