在我的数据库中,我有两个表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
只要始终存在一对一的关联在两个表上的引用号之间,添加一个外键对它之前建立的任何应用程序应该没有影响。问题是如果它被设置为空,设置为被引用表中不存在的内容,或者主体方(可能是订单)被删除而没有删除相关的支付。 –