2017-06-30 70 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

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

相关问题