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

How to set a relationship between two entities that don't have an (integer) foreign key?

在我的数据库中,我有两个表 tblOrderstblPayments,它们都包含一个名为 ReferenceNumber (varchar 50) 的 属性。不幸的是 tblPayments 没有指向 tblOrders 的外键,因此将这两个表中的记录关联起来的唯一方法是引用匹配的 ReferenceNumber(1 个命令可以有 n 次付款)。

在我使用 Entity Framework Core 的 ASP.NET Core 1.1 应用程序中,我试图为两个模型 Order.csPayment.cs.[=21= 定义这种关系]

在相关的配置文件中我尝试设置如下:

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: 'The relationship from 'Payment.Order' to 'Order.Payments' with foreign key properties {'ReferenceNumber' : string} cannot target the primary key {'Id' : int} because it is not compatible. Configure a principal key or a set of compatible foreign key properties for this relationship.'

这听起来很有道理,但是考虑到上述情况,我该如何正确设置关系呢?

你不能两全其美。看起来你正在使用一个现有的数据库,它实际上没有外键。您不能简单地告诉 EF 假装好像有一个。您要么需要更改该数据库以使其具有适当的外键,要么您需要放弃关系的 EF 建模并仅手动查询相关实体。例如,要获取特定订单的付款:

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

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