20

讓我們假設我們有這樣的情況:實體框架(數據庫優先)多重關係到同一個表的命名約定控件

表在數據庫:

Country (id, country_name), Person (id, login), CountryManager (id_country, id_person), CountryStakeholder (id_country, id_person)

如果我們必須創建模型從數據庫中,使用實體框架數據庫,首先,在VS我們就會有一個類這樣:

class Country { 

int id; 
string country_name; 

virtual ICollection<Person> Person1; // Navigation Properties 
virtual ICollection<Person> Person2; // ---------||---------- 

} 

我簡化了許多代碼,但希望你明白了。

似乎當實體框架處理外鍵時,它會創建通用的導航屬性。有沒有可能控制如何通過名稱創建導航屬性?不幸的是,Person1,Person2並不是很有說服力。

+1

個人而言,我更喜歡使用數據庫優先方法。而且,我使用它取得了很多成功。但是,我在我的數據庫中執行嚴格的命名約定。我有一個實用程序腳本,它將篡改數據庫並重命名我的外鍵以符合我的命名約定。 FKs到達EDMX時,他們的名字實際上是有意義的。因此,EDMX是有道理的,而T4則可以生成有意義的代碼。 – 2016-02-24 02:30:37

+1

你能分享腳本嗎?我認爲這將是解決方案 – 2016-02-26 01:01:42

+1

@AdrianK最接近的選擇。你有沒有找到解決方案? – Lijo 2017-06-07 23:02:07

回答

1

在VS中,您可以使用GUI進行此操作。

如果顯示模型瀏覽器,然後向下導航樹:

YourEntityModel>的實體類型>國家

然後右鍵點擊「PERSON1」導航屬性,選擇「屬性」,你可以再變導航屬性名的名稱,不管你喜歡:

enter image description here

只需更改名稱,保存更改和你做......

(其實有很多方法去的導航屬性屬性窗口 - 你愛泰克太模型圖中右鍵點擊)

+3

我試圖避免這種方法,因爲如果我再次從數據庫重新生成模型,它將覆蓋您在此處顯示的名稱屬性 – 2014-11-05 13:22:52

0

從書籍「Programming Entity Framework: Code First」條目「Working with Inverse Navigation Properties」:

您可以添加配置(使用數據註釋或Fluent API) 將此信息顯示給模型構建器。使用數據 註釋,您將使用名爲InverseProperty的註釋。通過使用流利API,您將使用Has/With方法與 的組合指定這些關係的正確結束。

您可以將註釋放置在關係的任一端(如果需要,也可以是 兩端)。我們會將它們粘貼在Lodging類的導航屬性 (示例4-10)中。 InverseProperty Data 註釋需要相關類的 中相應導航屬性的名稱作爲其參數。

例子:

[InverseProperty("PrimaryContactFor")] 
public Person PrimaryContact { get; set; } 

[InverseProperty("SecondaryContactFor")] 
public Person SecondaryContact { get; set; } 
+0

這是否可以更新?我的意思是,如果我在表中添加一列並重新生成模型,這會被覆蓋嗎? – 2014-11-05 13:24:03

+2

我認爲OP是使用Database First?他說:「如果我們必須從VS中的數據庫創建模型...」 – 2014-11-05 13:31:01

+1

恐怕不是;這是使用數據庫優先方法的一個缺點。 – BCdotWEB 2014-11-05 13:32:33

0

我建議使用https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838

它允許比我見過的任何數據庫生成的東西更多的靈活性。 我仍在努力解決自己的問題,但這看起來很有希望。但是,與EF提供的默認代碼生成不同,您可以自定義映射。

就像我在重命名導航屬性中看到的所有例子一樣 - 這還不夠,因爲EF仍然需要被映射以使用這些導航屬性(儘管你可以破解它,例如,您的User2指向ModifiedByUser)。

相關問題