我想了解實體框架代碼優先。c#多對多關係代碼第一,沒有流利的API
是否可以配置多對多的關係,而不使用流利的API,但只是DataAnnotation? 例如在this tutorial我不明白這兩個例子是否是同一件事,但以不同的方式完成,或者它們必須一起存在。
如果他們對於同一事物是不同的方式,實際上有什麼區別?
如果他們必須共存,API「部分」在做什麼?
我想了解實體框架代碼優先。c#多對多關係代碼第一,沒有流利的API
是否可以配置多對多的關係,而不使用流利的API,但只是DataAnnotation? 例如在this tutorial我不明白這兩個例子是否是同一件事,但以不同的方式完成,或者它們必須一起存在。
如果他們對於同一事物是不同的方式,實際上有什麼區別?
如果他們必須共存,API「部分」在做什麼?
確實你是對的。
這一段:
Student類應該有一個課程集合導航屬性,當然應該有學生集合導航屬性:許多一對多關係使用DataAnnotation
配置,
是錯誤的。由於在每個類中添加集合時,會按照慣例自動創建示例代碼中的多對多關係。唯一使用的數據註釋是Required
屬性,這不屬於多對多關係。
順便提一句,有關「使用Fluent API配置多對多關係」的部分是正確的,但在其示例代碼中,它們只使用自定義名稱連接表中的外鍵,而不是讓代碼先生成它。通過使用ForeignKey
屬性,也可以使用數據註釋完成重要的重命名。
他們是配置數據庫的兩種不同的方式。他們可以共存,但他們不必;你可以只使用一個或另一個。如果您同時使用兩者,則Fluent API優先於數據註釋,但數據註釋仍優先於默認約定。
不同之處在於,API允許更嚴格的控制程度,以換取(可以說)更復雜的交換。你鏈接的例子顯示了兩種不同的方式來有效地完成相同的事情,如果你想創建特定的多對多關係,你可以使用其中一種。但是,如果你想對CourseStudents(或StudentCourse)表做一些奇怪的事情,那麼API方法會更具可配置性,而註解方法會更有限,但如果你不需要額外的功能,則更容易閱讀。
其實我試圖建立一個非常簡單的WPF應用程序。所以,由於API似乎更困難,我想我會使用數據註解。 – Koosshh56
課程構造函數中的HashSet是什麼?我已經看到了在這個關係的兩個方面都使用這個符號的例子,但是這裏只是在課程中使用它。 – Koosshh56
如果您啓用了Lazy Loading並啓用了Proxy,則不需要將這些行放入構造函數中。 Code First默認啓用這兩個配置。 在創建課程或學生的新實例時,初始化到構造函數中可避免開發人員在代碼中的某個地方實例化集合。全局地,當你自動實例化一個課程時,構造函數實例化Student的集合,那麼你可以在課程之後做.Students.Add without course.Students = new Hashset(),因爲構造函數已經爲你做了。 –
CodeNotFound
它們默認啓用。爲了利用這一點,你唯一需要注意的是你的所有屬性標量,導航和集合屬性必須聲明爲虛擬的並且有一個getter和setter。如果你這樣做,不需要實例化到構造函數中。 – CodeNotFound