为每个实体添加基类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);
/*...*/
}
答案 0 :(得分:0)
根据该错误,OrderProduct
中没有键,因为它继承了BaseModel
并且该键应位于基类(BaseModel
)中。如果希望它位于OrderProduct
中,请通过不在任何BaseModel
和DbSet
中使用OnModelCreating
来将.Entity<BaseModel>
从模型中排除(这样就不会调用{{1} }或类似的内容。
在您的情况下,我只会在BaseModel
中有一个密钥(ID)字段。