簡體   English   中英

在雙向關系和實體框架中保持完整性

[英]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來做到這一點? 有一些自動的方法可以做到這一點嗎?

使用實體框架存儲這些對象時,有什么特別的注意事項嗎?

UML圖

提前致謝

因為您詢問完整性檢查,所以我添加了此答案。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM