据我了解(如果我弄错了,请纠正我),它们之间有关系的实体类可以通过多种方式定义——(1)通过使用一个属性来表示一个标量键加上一个导航属性或(2 ) 仅使用导航属性。
如果您使用数据注释,我相信您唯一的选择是同时使用标量键和导航属性,而使用 Fluent API 两种方法都可用。
我的问题是采取哪种方法?各自的优缺点是什么?(这是关于外键和导航属性的两种选择......不是关于数据注释与流利的。
正如我所看到的,它归结为这些因素/担忧
- 同时拥有标量属性和导航属性可以被视为“弄脏”类。
- 只有导航属性需要调用 Includes() 才能访问 FK 值。我没有查看正在发送的 SELECT 语句,但我怀疑正在执行 JOIN 并且正在发回不需要的数据。
- 拥有标量属性将排除对 Include() 调用的需要。
- 正如我在上一个 SO 问题(相关问题)中所暗示的那样,看起来导航属性不能用作复合键的一部分,因此将被迫包含额外的标量键。如果你必须为一个属性做这件事,那么在你的所有类中保持一致是有意义的。
我错过了什么吗?一般来说,定义外键和导航属性的推荐方法是什么?为什么要同时提供这两种方法,因为它似乎混淆了水域?我查看了很多教程,并看到了这两种方法的混合。
谢谢你。