如何在 Entity Framework 核心的复合键中配置与常量的关系?

How to configure relationship with a constant in the composite key for Entity Framework Core?

public class Order
{
    public int Id { get; set; }
    public string Type { get; set; }
}

Order 有复合键 (Id, Type).

public class SalesOrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    public Order Order { get; set; }
}

SalesOrderItem 有键 Id.

我想配置 SalesOrderItemOrder 之间的关系。 SalesOrderItem 没有可用于为关系创建复合键的 OrderType 列。 OrderType 在使用 SalesOrderItem 时总是 SAL

我尝试通过在外键部分设置常量来配置关系:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Order>()
        .HasKey(o => new { o.Id, o.Type });

    modelBuilder
        .Entity<SalesOrderItem>()
        .HasKey(s => s.Id);

    modelBuilder
        .Entity<Order>()
        .HasMany<SalesOrderItem>()
        .WithOne(salesOrderItem => salesOrderItem.Order)
        .HasForeignKey(salesOrderItem => new {salesOrderItem.OrderId, Type = "SAL"});
}

有效。

我能做什么?

您不能使用常量作为参考,但您可以像这样导出另一个 table:

public class SalesOrder : Order
{
}

public class SalesOrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    public SalesOrder Order { get; set; }
}

并像这样配置您的销售订单

modelBuilder.Entity<Order>()
    .HasDiscriminator(t => t.Type)
    .HasValue<SalesOrder>("SAL");

然后仅使用外键映射到销售订单

modelBuilder
    .Entity<Order>()
    .HasMany<SalesOrderItem>()
    .WithOne(salesOrderItem => salesOrderItem.Order)
    .HasPrincipalKey(salesOrderItem => salesOrderItem.OrderId);

编辑:因为它有使用主键的复合索引是@Jogge 评论的选项。