【发布时间】: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<JobBase>().HasKey(aa => aa.JobId);而不是mb.Entity<Job>().HasKey(aa => aa.JobId);吗? -
这也不起作用。这会导致 EF 创建一个我不想要的 JobBase 表。
-
将 JobBase.JobId 更改为 JobBaseId 或 Id 或在 JobId 上添加 [Key] 属性。默认的主键规则是:类应该具有用于主键的“CLASSId”或“Id”属性。在其他属性命名类型中,您应该使用属性“[Key]”。将 JobId 更改为 Id 是更好的解决方案。
标签: entity-framework-core blazor-webassembly