【问题标题】:How do you implement a base and derived class where primary key is defined in the base class你如何实现基类和派生类,其中主键在基类中定义
【发布时间】:2021-03-28 19:07:15
【问题描述】:

鉴于以下代码示例,您如何在不需要为基类创建表但为派生类创建表且在基类中定义主键的实体框架核心中实现此功能?

public class JobBase
{
    public JobBase() { }

    public Guid JobId { get; set; } = Guid.NewGuid();

    public string Title { get; set; }
}

public class Job : JobBase
{
    public Job() { }

    public String AdditionalInformation { get; set; }
}

这是我的 DBContext 类中的内容:

public DbSet<Job> Jobs { get; set; }

var job = mb.Entity<Job>();
        job.HasKey(aa => aa.JobId);
        job.Property(aa => aa.JobId).HasColumnName("JobId");

我目前在尝试添加迁移时收到以下错误:

无法在“作业”上配置键,因为它是派生类型。必须在根类型“JobBase”上配置密钥。如果您不打算将“JobBase”包含在模型中,请确保它未被上下文中的 DbSet 属性引用、在对 ModelBuilder 的配置调用中引用或从包含在模型。

我正在做的错误消息的唯一部分是 JobBase 是从模型中包含的类型的导航中引用的,但这样做是我首先实现这种关系的全部原因,所以我不能只是删除该导航。

【问题讨论】:

  • 你试过mb.Entity&lt;JobBase&gt;().HasKey(aa =&gt; aa.JobId);而不是mb.Entity&lt;Job&gt;().HasKey(aa =&gt; aa.JobId);吗?
  • 这也不起作用。这会导致 EF 创建一个我不想要的 JobBase 表。
  • 将 JobBase.JobId 更改为 JobBaseId 或 Id 或在 JobId 上添加 [Key] 属性。默认的主键规则是:类应该具有用于​​主键的“CLASSId”或“Id”属性。在其他属性命名类型中,您应该使用属性“[Key]”。将 JobId 更改为 Id 是更好的解决方案。

标签: entity-framework-core blazor-webassembly


【解决方案1】:
modelBuilder.Entity<Job>().HasKey(x => x.JobId).ToTable("Job");

EF Inheritance and Primary Keys

【讨论】:

  • 您引用的帖子已有 7 年历史。我在智能感知中没有看到 .ToTable 选项。我是否遗漏了什么或者这在 Entity Framework Core 中不可用?
  • 安装 Microsoft.EntityFrameworkCore.Relational
  • 完成。我仍然没有得到“ToTable”的智能感知,如果我继续输入它,我会得到以下编译错误。同时我会用谷歌搜索,但以防万一你知道问题是什么......'KeyBuilder'不包含'ToTable'的定义,最好的扩展方法重载'RelationalEntityTypeBuilderExtensions.ToTable(EntityTypeBuilder,string)'需要'EntityTypeBuilder' 类型的接收器
  • 如果不需要,请尝试删除它
  • 尝试删除 Nuget 包?我不知道它是否需要。您提供的解决方案看起来很有希望,但我目前不知道该怎么做才能调用 .ToTable() 如果这确实是解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 2019-03-02
相关资源
最近更新 更多