如何设置两个没有(整数)外键的实体之间的关系?

时间:2017-06-30 15:13:15

标签: asp.net-core ef-code-first entity-framework-core

在我的数据库中,我有两个表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:&#39;来自&#39; Payment.Order&#39;的关系到&#39; Order.Payments&#39;具有外键属性{&#39; ReferenceNumber&#39; :string}无法定位主键{&#39; Id&#39; :int}因为它不兼容。为此关系配置主键或一组兼容的外键属性。&#39;

这听起来很合理,但考虑到上述情况,我怎样才能正确地建立关系?

1 个答案:

答案 0 :(得分:2)

你不能双管齐下。您似乎正在使用现有数据库,该数据库实际上没有外键。你不能简单告诉EF假装有一个。您需要更改该数据库以使其具有适当的外键,或者您需要省略关系的EF建模并只需手动查询相关实体。例如,要获得特定订单的付款:

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

而不是更简单的order.Payments,它需要外键。