我發現,如果我根據需要設置導航屬性(使用必需屬性)並使用延遲加載代理,當我加載父實體並且什麼也不做時嘗試保存在相同的上下文中,發生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屬性,我得到「地址字段是必需的!」。由於每個用戶都應該有一個地址,我希望該屬性可以創建一個一致的模型。
在一些論壇中,我發現帖子建議在加載父實體時包含導航屬性(換言之,熱切加載),但如果我們有太多導航屬性,則不是一種可行的方法。
我做錯了什麼或有沒有其他方法來實現這種功能?
可能的重複[EF:使用惰性加載,需要的屬性時驗證失敗更新](http://stackoverflow.com/questions/6038541/ef-validation-failing-on-update-when-using-lazy -d-required-properties) – 2011-12-15 13:46:42