C#-实体框架核心-多对多关系错误

时间:2020-08-12 09:11:21

标签: c# entity-framework-core

为每个实体添加基类BaseModel之后,对于每个多对多实体关系(在本例中为OrderProduct),我将得到下一个错误:

System.InvalidOperationException:无法在'OrderProduct'上配置键,因为它是派生类型。必须在根类型“ BaseModel”上配置密钥。如果您不打算将“ BaseModel”包含在模型中,请确保它不包含在上下文的DbSet属性中,在对ModelBuilder的配置调用中引用,或从包含的类型的导航属性中引用在模型中。

添加基类时我错过了什么吗?

以下是实体:

public class BaseModel
{
    public DateTime? CreatedAt { get; set; }
    public User CreatedBy { get; set; }
    public int? CreatedById { get; set; }
}
public class OrderProduct : BaseModel
{
    public int OrderId { get; set; }
    public Order Order { get; set; }

    public int ProductId { get; set; }
    public Product Product { get; set; }
}
public class Order : BaseModel
{
    /*...*/ 
    public IList<OrderProduct> OrderProducts { get; set; }
}
public class Product : BaseModel
{
    /*...*/
    public IList<OrderProduct> OrderProducts { get; set; }
}

这是我在上下文类中的实体配置:

protected override void OnModelCreating(ModelBuilder builder)
{
    /*...*/
    builder.Entity<OrderProduct>()
        .HasKey(u => new { u.OrderId, u.ProductId });

    builder.Entity<OrderProduct>()
        .HasOne(u => u.Order)
        .WithMany(u => u.OrderProducts)
        .HasForeignKey(u => u.OrderId);

    builder.Entity<OrderProduct>()
        .HasOne(u => u.Product)
        .WithMany(u => u.OrderProducts)
        .HasForeignKey(u => u.ProductId);
    /*...*/
}

1 个答案:

答案 0 :(得分:0)

根据该错误,OrderProduct中没有键,因为它继承了BaseModel并且该键应位于基类(BaseModel)中。如果希望它位于OrderProduct中,请通过不在任何BaseModelDbSet中使用OnModelCreating来将.Entity<BaseModel>从模型中排除(这样就不会调用{{1} }或类似的内容。

在您的情况下,我只会在BaseModel中有一个密钥(ID)字段。