2013-07-17 86 views
2

我正在尋找關於在實體框架中持久保存的C#POCO之間的雙向關係的最佳做法。維護雙向關係和實體框架中的完整性

一個家庭有零到多個家庭成員和一個人總是有一個家庭。現在,當我實例化一個新的人物和新的家庭:

Person john = new Person(); 
Family adams = new Family(); 

我會再添加人的家庭,反之亦然。這需要:

adams.familyMembers.Add(john); 
john.family = adams; 

我想知道是否有一些更好的方式來做到這一點,因爲如果我添加一個人一個家庭,那人家庭財產應該總是被設置爲家庭。如果開發人員忘記這麼做,你最終會得到孤兒對象。

我是否使用完整的getter和setter來做到這一點?有沒有一些自動化的方式來做到這一點?

使用實體框架存儲這些對象時是否有任何特殊的考慮?

UML diagram

在此先感謝

回答

0

實體框架可以不在乎是否設置另一個方向與否,它仍然會正確的儲存。但是,在使用您的域模型時,您可能想要立即訪問這兩個導航屬性。這需要設置屬性,因爲你正在做。我使用的幾乎所有的導航集的解決方案是以下

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; 
    } 
} 
+0

這是很好的,但並不妨礙任何人直接使用'FamilyMembers.Add(人)' –

+0

更改爲IEnumerable的防止添加() –

+0

我會接受這個答案,似乎是一個正確的方式,謝謝;)任何其他意見,但歡迎! – peterrus

1

我添加了這個答案,因爲你問起完整性檢查。 EF中的此功能被廣泛忽視。

你波蘇斯可以實現IValidatableObject

public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 

Validate由EF呼籲SaveChanges,除非禁用它。

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; 
+0

高度讚賞,將實施此! – peterrus