2012-02-13 101 views
14

我有一個問題,即新添加的實體的屬性不是延遲加載,如果需要在添加實體後立即添加。添加代碼優先實體不延遲加載屬性

例如:

我有一個虛擬JobRole屬性的用戶實體:

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

    public virtual JobRole JobRole { get; set; } 
    public int JobRoleId { get; set; } 

    public string Name { get; set; } 
} 

我然後添加新的用戶:

public User Add(User user) 
{ 
    var addedUser = _myContext.Users.Add(user); 
    myContext.SaveChanges(); 
    return addedUser; 
} 

返回參照新的用戶然後傳遞給Razor視圖,在那裏它試圖顯示JobRole(例如JobRole.Name)。在用戶傳遞到視圖時,它具有:

  • JobRoleId正確設置爲整數值。
  • JobRole = NULL

那麼我希望JobRole偷懶加載,通過查看使用時,但它是不是和導致空引用異常。

這是預期的行爲,還是有辦法讓新添加的實體延遲加載其屬性?

在此先感謝您的任何想法。

環境: 使用實體框架4.2代碼優先。 啓用延遲加載。

+0

我有這個問題,答案是正確的。但是,我的代碼首先使用數據庫。所以我建議你編輯標題,以便將來的搜索更容易登陸。 – 2015-07-26 09:15:31

回答

20

這是因爲:

context.ContextOptions.LazyLoadingEnabled = false; 

如果這不起作用,你可以使用這個加載屬性DbSet.Add方法返回相同已傳遞給它作爲參數的對象,在您的情況下它不是代理實例,因此延遲加載不可用。

你應該使用DbSet.Create方法,該方法將返回代理實例,然後通過DbContext堅持前轉讓其性能打造了被傳遞到DbSet.AddUser對象。

下面是一個例子:

public User Add(User user) 
{ 
    var newUser = _myContext.Users.Create(); 

    // Copy the property values from 'user' to 'newUser' e.g. 
    // newUser.Name = user.Name 

    _myContext.Users.Add(newUser); 
    myContext.SaveChanges(); 

    return newUser; 
} 
+7

完美。解決了我的問題 - 非常感謝。要複製用戶屬性,我只需在SaveChanges()之前添加一行:_myContext.Entry(newUser).CurrentValues.SetValues(user);似乎工作正常。 – Appetere 2012-02-13 14:43:36

+0

@Steve更好。我很高興我可以幫助:) – 2012-02-13 14:55:18

1

您可以嘗試兩件事情,第一個是執行急切加載:http://msdn.microsoft.com/en-us/library/dd382880.aspx

+0

感謝您花時間回答我的問題。但是,關閉延遲加載並不會使所有內容都急切加載 - 您只需在檢索項時應用「包含」語句,而不是添加它們。我可以手動加載屬性,但我真的想明白爲什麼這不會自動發生。 – Appetere 2012-02-13 14:21:12

+0

隨時。別客氣。 =) – 2012-02-13 14:23:23

+0

嗯,可能是因爲你沒有使用include方法實施加載。如果您的上下文是延遲加載的,則該類的關係屬性將被加載,因爲它是您實體的屬性,但實際上該關係的屬性不會。 – 2012-02-13 14:28:21