私のデータベースにはという名前の2つのテーブルtblOrders
とtblPayments
があります。残念ながらtblPayments
にはtblOrders
を指す外部キーがないので、これらの2つのテーブルからのレコードを関係に置く唯一の方法は、一致するReferenceNumber
(1回の支払いでn回の支払いが可能)を参照することです。(整数)外部キーを持たない2つのエンティティ間の関係を設定するにはどうすればよいですか?
エンティティフレームワークコアを使用するASP.NET Core 1.1アプリケーションでは、このモデルを2つのモデル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: '外部キープロパティ{' ReferenceNumber ':string}を持つ' Payment.Order 'から' Order.Payments 'への関係が互換性がないため、主キー{' Id ':int}をターゲットできません。この関係のプリンシパルキーまたは互換性のある外部キープロパティのセットを構成します。
これはかなり妥当ですが、上記の状況を考慮して適切な関係を設定するにはどうすればよいですか?
ええ、私は既存のデータベースを使用しています。私は、tblPaymentsに外部キーを追加する可能性がある場合はソートする必要がありますが、私はすでにこのデータベースに依存しているアプリケーションの複雑さのために悲観的です – Dario
常に1対1の相関がある限り両方のテーブルの参照番号の間に、外部キーを追加することは、そこに存在する前に構築されたアプリケーションには影響しません。問題が、nullとして設定されているか、参照されているテーブルに存在しないものに設定されているか、プリンシパル側(おそらく注文)が関連する支払いを削除せずに削除された場合です。 –