【问题标题】:C# - Entity Framework Core - Many to Many relation errorC# - 实体框架核心 - 多对多关系错误
【发布时间】:2020-08-12 09:11:21
【问题描述】:

在为每个实体添加基类 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);
    /*...*/
}

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    根据报错,OrderProduct中不可能有key,因为它继承了BaseModel,并且key应该在基类(BaseModel)中。如果您希望它位于 OrderProduct 中,请通过不在任何 DbSetOnModelCreating 中包含 BaseModel 从模型中排除它(这样您就不会调用 .Entity&lt;BaseModel&gt; 或类似名称。

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

    【讨论】:

    • 感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    相关资源
    最近更新 更多