EF Core中多父实体共享同一子实体的实现方案咨询
关于EF Core中多父实体共享子实体的实现方案疑问
核心实体结构需求
需要实现以下实体结构,其中多个父实体(Project、Customer)都要与同一个子实体(Notes)建立一对多关系:
ProjectEntity Id Name List<Notes> CustomerEntity Id Name List<Notes> NotesEntity Id Date Note
常规的单ParentId字段结构无法满足需求,因为无法区分父实体类型:
NotesEntity Id ParentId Date Note
现有方案疑问
- 添加父实体类型标识字段:在NotesEntity中增加
ParentType字段来区分父实体类型,这种方式是否可行?有没有更优方案?如果采用该方式,是否无法使用EF Core常规的一对多关系特性,必须手动处理增删查改? - 继承基类方案:让所有需要关联Notes的父实体继承自包含
List<Notes>的BaseEntity,NotesEntity通过BaseEntityId关联基类。如果父实体数量较多,这个方案是不是最优选择?
Owned类型使用问题
尝试使用Owned类型包含集合项时,执行add-migration报错:
[Owned] public class Note { public int Id { get; set; } public string Text { get; set; } public int UserId { get; set; } public User User { get; set; } public ICollection<string> Tags { get; set; } }
错误信息:
无法确定类型为'ICollection
'的导航属性所表示的关系,请手动配置关系,或使用'[NotMapped]'特性忽略该属性.....
考虑新增中间实体来处理Tags:
public class NoteTagsEntity { public int Id { get; set; } public ICollection<string> Tags { get; set; } }
修改后的Owned类型:
[Owned] public class Note { public int Id { get; set; } public string Text { get; set; } public int UserId { get; set; } public User User { get; set; } public int NoteTagsId { get; set; } public NoteTagsEntity NoteTags { get; set; } }
这种修改是否可行?
已实现的方案
通过在NotesEntity中添加两个外键(一个指向父实体ID,一个指向使用该笔记的模块ID)实现了笔记功能,这种方式无需在实体中建立显式父子关系,后续便于扩展更多使用笔记的模块,但需要手动处理关联逻辑。
内容的提问来源于stack exchange,提问作者Tobias Gustafsson
相关产品推荐
相关产品推荐

