1 回答
![?](http://img1.sycdn.imooc.com/5333a1d100010c2602000200-100-100.jpg)
TA贡献1951条经验 获得超3个赞
主要问题是不同的上下文。值对象(拥有的实体类型)只是一个结果 - 如果没有值对象,那么您将会遇到另一个问题。
您的设计似乎基于一个错误的假设,即只有来自公开暴露的实体类DbSet
。但事实并非如此。还包括导航属性引用的实体,以及它们引用的实体等。
这是合乎逻辑的,因为 EF Core 上下文表示具有表和关系的数据库。EF Core 需要了解所有相关实体,以便正确支持加载相关数据、查询(联接)、级联删除、表、列、主键和外键属性/列及其映射等。
EF Core 文档的包含和排除类型部分对此进行了解释:
按照约定,上下文属性中公开的类型
DbSet
将包含在模型中。此外,OnModelCreating
还包括方法中提到的类型。最后,通过递归探索已发现类型的导航属性找到的任何类型也包含在模型中。
调整他们的示例ChildContext
,发现以下类型:
Child
因为它暴露在DbSet
上下文的属性中Parent
因为它是通过Child.Parent
导航属性发现的Address
因为它是通过Parent.PrimaryAddress
导航属性发现的
由于ChildContext
没有实体配置,EF 假定与( 和)Parent
相关的所有内容均符合约定,因此出现例外。Parent
Address
Shorty,使用包含相关实体的单独上下文不是一个好主意。解决方案是将所有相关实体放在一个上下文中并进行维护。
查看所使用的术语,您可能关注的是 DDD 和有界上下文,但这些不适合 EF Core(通常在关系数据库中)模型。
- 1 回答
- 0 关注
- 81 浏览
添加回答
举报