2014-03-12 78 views
3

鑑於:在代碼中添加關係只

  • 數據庫模型不能觸及(由供應商提供的數據庫,我們會失去支持,如果我們改變數據)
  • 所有實體間的關係缺少

通常情況下,我們確實有ID,名稱的用戶表...和與ID,USER_ID,量... 交易表由於沒有在數據庫級別沒有關係,實體框架不涉及在一起的對象,並沒有辦法使用constr如下所示:

transactions.Select(t=> new {t.id, t.user.name, t.amount}) 

有沒有辦法在實體框架(模型優先)中手動添加關係,以便我們可以利用Linq?

+0

因此,如果沒有定義關係,您的供應商如何確保參考完整性?觸發器? – Marco

+0

我想他們在代碼級別手動執行它 – Jaepetto

回答

1

是的,它有可能。

型號第一

在EDMX設計器,右鍵單擊>添加新>協會。你會得到一個對話框,以建立兩個模型之間的關係:

enter image description here

代碼類似於下面的模型建立第一

的東西應該工作,即使沒有目前的數據庫關係:

public class User 
{ 
    public int UserId { get; set; } 

    [ForeignKey("UserId")] 
    public virtual ICollection<Transaction> Transactions { get; set; } 
} 

public class Transaction 
{ 
    public int TransactionId { get; set; } 

    [ForeignKey("User")] 
    public int UserId { get; set; } 

    public User User { get; set; } 
} 

當你的模型是建立在這種方式中,以下LINQ:然後

transactions.Select(t=> new {t.id, t.user.name, t.amount}); 

應該是可能的,並且將運行時EF很好地轉換成SQL。

+0

從數據庫中生成模型時,您如何實現這一目標?編輯自動生成的模型是否安全? – Jaepetto

+0

絕對是我的錯,我先閱讀代碼!!! :我會留在這裏作爲參考。 – Oliver

+0

這就是我的想法。無論如何感謝您的時間。 – Jaepetto

0

通常,使用實體框架生成的所有類都是partial。這意味着您可以在項目中添加第二個.cs文件,您可以在其中添加相同的類(在相同的名稱空間內)並向其中添加自己的方法。您可以添加自己的AddRelationsToDataSet()方法,如果您通過模型上的設計人員進行更改,這種方法將不會被觸及。

唯一的缺點是,您必須在構造函數之後的每個地方手動調用此方法。或者你在調用構造函數的部分類部分中創建一個靜態的Create()方法,然後在你的方法中創建一個方法。然後,您只需檢查沒有人直接調用構造函數,但只能通過創建者方法調用。