如何在 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
.
我想配置 SalesOrderItem
和 Order
之间的关系。 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 评论的选项。
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
.
我想配置 SalesOrderItem
和 Order
之间的关系。 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 评论的选项。