2014-05-20 100 views
1

我有兩個名爲Profile和ProfileHistory的表。 ProfileHistory中的每條記錄都必須屬於配置文件表中的配置文件,因此兩個表之間存在外鍵關係。此外,在ProfileHistory表中,還有一個名爲ManagerId的列,它也與具有外鍵關係的Profile表相關。實體框架導航屬性命名約定

檔案表結構

ID INT主鍵 .... ....

ProfileHistory表結構

ID INT主鍵

簡檔INT外鍵簡介表

ManagerId配置文件表的外鍵

....

我的問題是: 由於目前我只知道這一點,我創建數據庫,從我的實體模型。 模型,因此實體類與導航屬性在 ProfileHistory實體像以下創建:

public virtual Profile Profile { get; set; } 
public virtual Profile Profile1 { get; set; } 

它是如此混亂。因爲不清楚哪個導航屬性爲哪個關係。 即使我在兩張桌子之間有更多關係,情況也會更糟糕。導航屬性名稱正在成爲配置文件,Profile1,Profile2等 我期待有與其外鍵關係相關的導航屬性的名稱。

如何使我的導航屬性名稱與其外鍵關係有關,在我的情況下「從Profile1到ProfileManager」?

在此先感謝您的幫助。

Muharrem

回答

1

您可以隨時重命名模型圖中的屬性。當您點擊導航屬性時,可以在屬性窗口中找到該名稱。

+1

我affraid ,當你更新時,你的屬性會被重新命名,所以在開發環境中做這件事非常令人沮喪。 – Complexity

+2

不,您所做的手動更改不會被覆蓋。我總是使用Model和DB第一種方案來做到這一點。 – SoftwareFactor

+0

好的,我爲這個錯誤道歉:-) – Complexity

1

我沒有測試它,但你可以使用屬性的屬性映射到列:

[Column(「BlogDescription", TypeName="ntext")] 
public virtual Profile Profile { get; set; } 

[Column("Profile1", TypeName="int")] 
public virtual Profile ProfileManager { get; set; } 

更改類型和列的名稱,因爲它是在數據庫。

-1

前段時間我確實面臨同樣的問題。那麼,它更大,然後只是混亂的名字。如果你有另一個表的導航屬性,如Profile,Profile1,Profile2,接下來你刪除/編輯相應的外鍵,你最終可能會混在一起。如果使用EntitySQL查詢數據,最終會因爲檢索到的錯誤數據/錯誤的表連接條件而出現錯誤...

我所做的是更改t4模板並修改了生成屬性的方式。在編寫屬性代碼文本時,您將獲得關於與其相關的關聯和外鍵的信息。外鍵的名字都在數據庫中是唯一和我命名爲那些有以下模式

​​

接下來,有這個信息,我命名爲外鍵名稱的[Meaning]部分屬性。

+0

-1沒有跡象表明如何做到這一點 - 如果你沒有詳細說明要做什麼改變,人們應該如何使用這個答案? – Bertie

+0

你想要我在這裏粘貼t4代碼嗎?當您在t4中建立實體中每個單獨屬性的信息時,您將擁有元數據上下文。只需使用關於協會的信息 – Andrew

+0

嗨安德魯 - 這將是很好的給一些片段,以指示如何做到這一點。儘管我現在使用了一些其他資源,但我已經設法做了一份體面的工作 - 但它對未來的讀者可能會很好。我發現最有用的帖子可以在這裏找到:http://stackoverflow.com/a/13064383/978562 – Bertie

0

我通常解決這個問題的方法是通過部分類來添加屬性,這些屬性可以更好地表示我所追求的內容。這樣,如果我需要從圖中刪除實體並重新添加它,則不會丟失模型中的任何重命名列。

這樣做的缺點是您需要記住您不能在查詢中使用它們,因爲EF不知道如何將它轉換爲SQL查詢。但是如果你已經有了你的Profile對象,訪問myProfile.Manager比myProfile.Profile1容易得多。

因此,舉例來說,如果EF創造了這個給你:

public partial class ProfileHistory 
{ 
    public virtual Profile Profile { get; set; } 
    public virtual Profile Profile1 { get; set; } 
} 

我最終會創建一個部分類像這樣重新映射列:

public partial class ProfileHistory 
{ 
    public Profile Manager 
    { 
     get 
     { 
      return this.Profile1; 
     } 

     set 
     { 
      this.Profile1 = value; 
     } 
    } 
}