2015-11-24 58 views
2

我想了解实体框架代码优先。c#多对多关系代码第一,没有流利的API

是否可以配置多对多的关系,而不使用流利的API,但只是DataAnnotation? 例如在this tutorial我不明白这两个例子是否是同一件事,但以不同的方式完成,或者它们必须一起存在。

  • 如果他们对于同一事物是不同的方式,实际上有什么区别?

  • 如果他们必须共存,API“部分”在做什么?

回答

2

确实你是对的。

这一段:

Student类应该有一个课程集合导航属性,当然应该有学生集合导航属性:许多一对多关系使用DataAnnotation

配置,

是错误的。由于在每个类中添加集合时,会按照惯例自动创建示例代码中的多对多关系。唯一使用的数据注释是Required属性,这不属于多对多关系。

顺便提一句,有关“使用Fluent API配置多对多关系”的部分是正确的,但在其示例代码中,它们只使用自定义名称连接表中的外键,而不是让代码先生成它。通过使用ForeignKey属性,也可以使用数据注释完成重要的重命名。

+0

课程构造函数中的HashSet是什么?我已经看到了在这个关系的两个方面都使用这个符号的例子,但是这里只是在课程中使用它。 – Koosshh56

+0

如果您启用了Lazy Loading并启用了Proxy,则不需要将这些行放入构造函数中。 Code First默认启用这两个配置。 在创建课程或学生的新实例时,初始化到构造函数中可避免开发人员在代码中的某个地方实例化集合。全局地,当你自动实例化一个课程时,构造函数实例化Student的集合,那么你可以在课程之后做.Students.Add without course.Students = new Hashset (),因为构造函数已经为你做了。 – CodeNotFound

+1

它们默认启用。为了利用这一点,你唯一需要注意的是你的所有属性标量,导航和集合属性必须声明为虚拟的并且有一个getter和setter。如果你这样做,不需要实例化到构造函数中。 – CodeNotFound

1

他们是配置数据库的两种不同的方式。他们可以共存,但他们不必;你可以只使用一个或另一个。如果您同时使用两者,则Fluent API优先于数据注释,但数据注释仍优先于默认约定。

不同之处在于,API允许更严格的控制程度,以换取(可以说)更复杂的交换。你链接的例子显示了两种不同的方式来有效地完成相同的事情,如果你想创建特定的多对多关系,你可以使用其中一种。但是,如果你想对CourseStudents(或StudentCourse)表做一些奇怪的事情,那么API方法会更具可配置性,而注解方法会更有限,但如果你不需要额外的功能,则更容易阅读。

+0

其实我试图建立一个非常简单的WPF应用程序。所以,由于API似乎更困难,我想我会使用数据注解。 – Koosshh56

相关问题