在我的数据库中,我有两个表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:&#39;来自&#39; Payment.Order&#39;的关系到&#39; Order.Payments&#39;具有外键属性{&#39; ReferenceNumber&#39; :string}无法定位主键{&#39; Id&#39; :int}因为它不兼容。为此关系配置主键或一组兼容的外键属性。&#39;
这听起来很合理,但考虑到上述情况,我怎样才能正确地建立关系?
答案 0 :(得分:2)
你不能双管齐下。您似乎正在使用现有数据库,该数据库实际上没有外键。你不能简单告诉EF假装有一个。您需要更改该数据库以使其具有适当的外键,或者您需要省略关系的EF建模并只需手动查询相关实体。例如,要获得特定订单的付款:
var payments = db.Payments.Where(m => m.ReferenceNumber == order.ReferenceNumber);
而不是更简单的order.Payments
,它需要外键。