Entity framework 首先需要澄清实体框架代码、导航属性和标量键

Entity framework 首先需要澄清实体框架代码、导航属性和标量键,entity-framework,data-annotations,fluent-interface,Entity Framework,Data Annotations,Fluent Interface,据我所知,如果我弄错了,请纠正我,在实体类之间有关系的实体类可以通过几种方式定义-1使用属性来表示标量键加上导航属性,或2仅使用导航属性 如果您使用数据注释,我相信您唯一的选择是同时使用标量键和导航属性,而使用fluentapi这两种方法都是可用的 我的问题是采取哪种方法?每种方法的优缺点是什么?这是关于外键和导航属性的两个选择…而不是数据注释与Fluent 在我看来,这归结于这些因素/担忧 同时具有标量属性和导航属性可能会被视为使类陷入混乱。 只有navigation属性需要Includes调

据我所知,如果我弄错了,请纠正我,在实体类之间有关系的实体类可以通过几种方式定义-1使用属性来表示标量键加上导航属性,或2仅使用导航属性

如果您使用数据注释,我相信您唯一的选择是同时使用标量键和导航属性,而使用fluentapi这两种方法都是可用的

我的问题是采取哪种方法?每种方法的优缺点是什么?这是关于外键和导航属性的两个选择…而不是数据注释与Fluent

在我看来,这归结于这些因素/担忧

同时具有标量属性和导航属性可能会被视为使类陷入混乱。 只有navigation属性需要Includes调用才能访问FK值。我没有查看正在发送的SELECT语句,但我怀疑正在执行联接,并且正在发送回不需要的数据。 拥有scalar属性将不需要Include调用。 正如我在前面的SO问题中所暗示的,导航属性似乎不能用作复合键的一部分,因此将强制包含额外的标量键。如果您必须为一个属性执行此操作,那么在所有类中保持一致是有意义的。 我遗漏了什么吗?通常,定义外键和导航属性的推荐方法是什么?为什么还要提供这两种方法,因为这似乎是在混水摸鱼?我看过很多教程,看到了这两种方法的混合

多谢各位

1使用属性表示标量键加上导航属性,或2仅使用导航属性

这就是两者的区别

如果您使用数据注释,我相信您唯一的选择是同时使用标量键和导航属性,而使用fluentapi这两种方法都是可用的

不。数据注释只是另一个提示。默认情况下,导航属性会自动识别

同时具有标量属性和导航属性可能会被视为使类陷入混乱

是的,但由于两种具有标量属性的关联类型的性质不同,使得一些开发任务更简单

只有navigation属性需要Includes调用才能访问FK值。我没有查看正在发送的SELECT语句,但我怀疑正在执行联接,并且正在发送回不需要的数据

对。Include意味着获取数据,但如果只需要在linq to entities查询中访问FK,则不需要使用它。例如:

 var children = from c in context.Children
                where c.Parent.Id == 123
                select c;
此查询通过父级访问FK,并在内部生成联接,但不获取父级

拥有scalar属性将不需要Include调用

否。包含依赖于导航属性,而FK属性本身不创建关联。在我的示例中,在父级或子级中,您必须始终在关系的至少一侧具有导航属性

看起来导航属性不能用作复合键的一部分

对。如果需要复合键,则需要在实体上公开外键