[英]maintaining integrity in bidirectional relations and Entity Framework
我正在尋找關於保持與實體框架保持一致的C#POCO之間的雙向關系的最佳實踐。
一個家庭有零到多個家庭成員,一個人總是有一個家庭。 現在,當我實例化一個新的人和一個新的家庭時:
Person john = new Person();
Family adams = new Family();
然后,我將該人添加到家庭中,反之亦然。 這需要:
adams.familyMembers.Add(john);
john.family = adams;
我想知道是否有更好的方法可以這樣做,因為如果我將一個人添加到一個家庭中,則該人的家庭財產應始終設置為該家庭。 如果開發人員忘記執行此操作,則最終將得到孤立對象。
我是否使用完整的getter和setter來做到這一點? 有一些自動的方法可以做到這一點嗎?
使用實體框架存儲這些對象時,有什么特別的注意事項嗎?
提前致謝
因為您詢問完整性檢查,所以我添加了此答案。 EF中的此功能被廣泛忽略。
您的POCO可以實現IValidatableObject
public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
除非已禁用,否則EF將在SaveChanges
上調用Validate
。
Context.Configuration.ValidateOnSaveEnabled = true; //default
編輯:示例代碼,以幫助您入門
// Sample Implementation.
var validationResult = base.Validate(validationContext).ToList();
// validationResult.AddRange(xxx); // an example of mini call for common validations
if (true) // the condition that leads to a validation error
{
var memberList = new List<string> { "PropertyName" }; // the name of the offending property
var error = new ValidationResult("Error text goes here", memberList); //
validationResult.Add(error);
}
return validationResult;
不管您是否設置其他方向,實體框架都不會在乎,它仍會正確保存。 但是,在使用域模型時,您可能希望立即訪問兩個導航屬性。 這需要在執行操作時設置屬性。 我用於幾乎所有導航集合的解決方案如下
public class Family
{
public Family()
{
this.FamilyMembers = new List<Person>();
}
public IEnumerable<Person> FamilyMembers {get; protected set;}
public void AddFamilyMember(Person person)
{
this.FamilyMembers.Add(person);
person.Family = this;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.