【发布时间】:2020-12-10 01:05:23
【问题描述】:
我正在尝试通过使用多个继承级别与多个实体共享公共属性,但我遇到了错误。
无法在“User.SupersCreated”和“Super.CreatedBy”之间创建关系,因为“User.BasicsCreated”和“Basic.CreatedBy”之间已经存在关系。导航属性只能参与单个关系。如果您想在“OnModelCreating”中首先在导航“Super.CreatedBy”上覆盖现有关系调用“Ignore”。
我的模型结构如下。
public class EntityBase
{
public Guid Id { get; set; }
public Guid CreatedById { get; set; }
public User CreatedBy { get; set; }
}
public class Basic: EntityBase
{
public string BasicProperty { get; set; }
}
public class Super : Basic
{
public string SuperProperty { get; set; }
}
public class User : IdentityUser<Guid>
{
public ICollection<Basic> BasicsCreated { get; set; }
public ICollection<Super> SupersCreated { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>()
.HasMany(x => x.BasicsCreated)
.WithOne(x => x.CreatedBy);
modelBuilder.Entity<User>()
.HasMany(x => x.SupersCreated)
.WithOne(x => x.CreatedBy);
}
问题似乎是Super 继承自Basic 的结果,或者至少,当我删除此级别的继承并使Super 继承自EntityBase 时,问题就消失了(但是比我'将丢失Basic 中存在的属性。
谁能帮我理解为什么我会收到这个错误以及应该做些什么来解决它?
编辑
在考虑了更多之后,我认为我试图滥用继承来做它不打算做的事情。
尽管我的Basic 和Super 表共享相同的属性,而Super 有它自己的附加属性,Basic 数据和Super 数据之间没有任何关系。
查看Microsoft's tutorial on implementing inheritance,有两种选择:
- 每种类型的表
- 每个层次结构的表
这些都不是我想要实现的目标。
也许我应该使用接口来定义存在于不相关实体之间的公共属性。看来我还是需要支持并重新评估我的设计。
【问题讨论】:
标签: c# inheritance entity-framework-core ef-code-first