2011-11-01 84 views
1

我的企業有一個從電子郵件創建MailMessage的方法。我使用的方法獲取一個Email對象作爲參數,這是一個簡單的POCO對象,外鍵屬性如ToId和FromId已經被設置。該實體還具有EmailAddress實體的導航屬性(FromEmailAddress和ToEmailAddress)。實體框架在新創建的實體上使用導航屬性

我想要的是使用這些導航屬性。我能這樣做的方式是下面的,但它看起來像一個HAX:

public MailMessage CreateEmail(Email email) 
    { 
     var tmpEmail = db.Set<Email>().Create(); 
     db.Emails.Add(tmpEmail); 
     db.Entry<Email>(tmpEmail).CurrentValues.SetValues(email); 
     db.SaveChanges(); 
     email = tmpEmail; 

然後,我使用的電子郵件在我的代碼。這樣,實體現在有一個代理,所以我可以使用導航屬性。有沒有更簡單的方法來做到這一點?

+1

您的實體必須附加到上下文以使用導航屬性。所以不行,雖然你可以用不同的方式編寫代碼,但它也可以實現你的目標。 – Svarog

+0

我也試過,但是當我用db.Emails.Attach(電子郵件)附加它時,導航屬性不可用。 – norbip

回答

1

在我看來,這是一個很好的解決方案來啓用延遲加載。另一種方法是明確加載導航屬性。當您使用延遲加載和訪問導航性能是相同的 -

public MailMessage CreateEmail(Email email) 
{ 
    db.Emails.Add(email); 
    db.SaveChanges(); 

    db.Entry(email).Reference(e => e.FromEmailAddress).Load(); 
    db.Entry(email).Reference(e => e.ToEmailAddress).Load(); 

    //... 
} 

它創建兩個往返到數據庫:那麼你並不需要創建一個代理。

+0

這個替代看起來有點乾淨,謝謝。 :) – norbip