[英]Entity Framework Core ForeignKey Default Conventions
我正在尋找[ForeignKey]
約定的文檔。 我在MSDN上找到了一份命名約定列表。
我不確定哪個約定映射了以下操作。
class Student
{
public int id{ set; get;}
public int myclassroomid{ set; get;}
public Classroom myclassroom{ set; get;}
}
class Classroom
{
[Key]
public int cid{ set; get;}
}
我不明白默認約定是如何工作的。
我找到了NavigationPropertyNameForeignKeyDiscoveryConvention ,它似乎不適用於這種情況。
我在哪里可以找到官方文檔? 如果有的話,解釋一些要點,最好有代碼示例。
NavigationPropertyNameForeignKeyDiscoveryConvention
涵蓋了 Student 中的導航屬性如何找到 Student 中聲明的 FK。 AFAIK 它不會考慮在 Classroom 實體中設置的任何內容。
它將使用類型和引用名稱,因此它將查找 ClassroomId 或 MyClassroomId。 這通常會讓那些想要使用多個引用到同一實體的人絆倒,其中一個導航屬性與類型名稱匹配。 即 CustomerId/Customer Customer 和 CreatedById/Customer CreatedBy。 EF 可能會嘗試根據類型將 CreatedBy 解析為 CustomerId。
導航屬性本身將結合對在您的課堂類型中聲明為 PK 的任何字段的引用。 刪除 Classroom 中 cId 上的[Key]
屬性將不起作用,因為這與 PK 約定規則不匹配。 (Id 或 ClassroomId)它也不會以這種方式影響 FK,即在 Student 中放置 cId 列很可能不會映射到 MyClassroom 引用。
就我個人而言,我總是對關系使用顯式映射,並且我避免聲明 FK 屬性,而是使用陰影屬性/ Map()
代替。 如果您打算使用約定,那么您的架構應該設置為符合它們而沒有特殊情況。 最簡單且最易讀的方法是對 PK 和 FK 引用使用 {TableName}+Id。 例外是對同一個表/實體的多重引用,然后對引用及其關聯的 FK 使用描述性名稱。 即如果兩個導航屬性都指向客戶實體,則 CreatedBy + CreatedById 和 OrderingCustomer + OrderingCustomerId 而不是 Customer + CustomerId。
你看錯了地方——所有這些都是針對 EF6 的,而 EF Core 是完全不同的系統,所以起點應該是這里的官方文檔Entity Framework Core 。
外鍵約定在關系 -約定中進行了描述,特別是:
如果依賴實體包含一個名稱與這些模式之一匹配的屬性,那么它將被配置為外鍵:
<navigation property name><principal key property name>
<navigation property name>Id
<principal entity name><principal key property name>
<principal entity name>Id
在您的示例中, myclassroomid
匹配規則 #2 - 導航屬性名稱“myclassroom”+“Id”。 它沒有明確提及,但匹配不區分大小寫,因此“Id` 也匹配“ID”、“id”等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.