2011-12-15 42 views
3

我發現,如果我根據需要設置導航屬性(使用必需屬性)並使用延遲加載代理,當我加載父實體並且什麼也不做時嘗試保存在相同的上下文中,發生EntityValidationError,就像「xxx字段是必需的」。實體框架代碼第一次更新錯誤與卸載所需的導航屬性

使用Java中的hibernate和.NET中的NHibernate,可以只取一個沒有導航屬性的實體(所有的延遲加載),更新它並再次保存。該框架意識到導航引用沒有任何改變,並且不會拋出任何錯誤。

的例子如下

[Table("Address")] 
public class Address 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int AddressId { get; set; } 

    [Required, StringLength(512)] 
    public virtual string AddressLine1 { get; set; } 
} 

[Table("User")] 
public class User 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 

    [Required] 
    public string Name {get; set;} 

    [Required] 
    public virtual Address Address {get; set;} 


} 


void LoadAndSaveUser() { 
    var user = Context.Users.First(); 
    user.Name = "foo"; 

    // if i comment out this line 
    // (probably EF fetches the lazy loaded entiy) 
    // the code works. it is strange though because i don't access any property/method of the Address 

    // var dummy = user.Address 

    Context.SaveChanges(); 
} 

當我嘗試這不會對地址屬性中的「必需的」屬性,不會發生錯誤。使用Required屬性,我得到「地址字段是必需的!」。由於每個用戶都應該有一個地址,我希望該屬性可以創建一個一致的模型。

在一些論壇中,我發現帖子建議在加載父實體時包含導航屬性(換言之,熱切加載),但如果我們有太多導航屬性,則不是一種可行的方法。

我做錯了什麼或有沒有其他方法來實現這種功能?

+2

可能的重複[EF:使用惰性加載,需要的屬性時驗證失敗更新](http://stackoverflow.com/questions/6038541/ef-validation-failing-on-update-when-using-lazy -d-required-properties) – 2011-12-15 13:46:42

回答

1

在您的User類中定義public int AddressId。它在用戶加載時加載。我認爲這將解決問題。

更新: 那麼,我已經轉載了您的問題。你有幾個選擇來防止這種情況。但有一件事是肯定的。您必須從您的Address屬性中刪除[必要]屬性。這是你問題的根源(這是合理的,因爲你告訴EF「我想要地址對象(不是外鍵但導航屬性)存在,如果它爲空,拋出異常」)。
另請在User類中定義AddressId類型int的屬性。

請注意,您也可以在您的Address實體中定義public virtual ICollection<User> Users { get; set; }

你可以告訴必需的屬性EF要麼是把[Required]AddressId,或使用流暢API:在用戶映射類

this.HasRequired(T => t.Address) .WithMany( ) .HasForeignKey(d => d.AddressId);

+0

它不起作用 – 2011-12-15 10:53:39