|
0
|
| quiqs · 技术社区 · 7 年前 |
|
|
1
1
首先要检查的是实体关系是如何映射的。通常导航属性应该标记为virtual,以确保EF可以代理它们。另一个优化是,如果实体引用子类别,那么由于子类别引用一个类别,这些实体不需要同时引用这两个类别。只有在子类别是可选的情况下才需要这两个。两者兼有并不一定会引起问题,但它会导致霜的类别与霜的子类别的类别不匹配的情况(看到了足够多的这样的bug,这取决于代码是frosting.CategoryId还是frosting.SubCategory.CategoryId)你的风格定义似乎只使用了SubCategory,这是好的,只是需要小心。 错误细节似乎表明EF知道实体,但没有被告知它们之间的关系。您需要确保您有映射细节来告诉EF霜和子类别是如何相关的。EF可以自动推断出其中的一些,但我的偏好总是明确的(我讨厌惊喜!)
考虑到您的Flavor实体似乎没有子类别id的属性,告诉EF它是有帮助的。EF也许能够推断出这一点,但是有了id和它所寻找的自动命名约定,我就不用费心去记什么是自动工作的了。
如果这是EF核心,你可以替换
将为FK设置阴影属性。
如果子类别是可选的,则替换
下一个注意点是在加载实体的DBContext范围之外传递实体。虽然EF确实支持将实体从一个上下文中分离出来并重新连接到另一个上下文,但我认为这种做法几乎是错误的 总是 麻烦远比它值得的多。将实体映射到POCO ViewModels/dto,然后在执行更新时按需再次加载它们更简单,并且在尝试重新附加它们时更不容易出错。数据状态可能在最初加载它们的时间和重新附加它们的时间之间发生了变化,因此故障保护代码无论如何都需要处理这种情况。它还省去了在实体集中处理修改状态的麻烦。虽然第二次加载实体似乎很有效,但是通过采用视图模型,您可以更有效地优化读取,只需回调和传输有意义的数据,而不是整个实体图(系统通常读取的内容远远多于更新的内容)即使对于更新繁重的操作,也可以利用有界上下文将大型表表示为较小的简单实体,以便更有效地加载和更新几个关键字段。 |
|
|
Paritosh · EF Core为什么要返回相关属性 1 年前 |
|
|
chuckd · 如何检查EF Core中是否存在当月创建的行(记录) 2 年前 |
|
|
Steven · 带sqlite的EF与sqlite净pcl 2 年前 |
|
|
Riyaz Vagapov · EF核心交易 2 年前 |