2

我正在寻找关于维护与实体框架保持一致的 C# POCO 之间的双向关系的最佳实践。

一个家庭有零到多个家庭成员,一个人总是有一个家庭。现在当我实例化一个新的人和一个新的家庭时:

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

然后我会将这个人添加到家庭中,反之亦然。这需要:

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

我想知道是否有更好的方法可以做到这一点,因为如果我将 Person 添加到 Family 中,则应该始终将 Persons 家庭属性设置为该家庭。如果开发人员忘记这样做,您最终会得到孤立对象。

我是否使用完整的 getter 和 setter 来执行此操作?有没有一些自动化的方法来做到这一点?

使用 Entity Framework 存储这些对象时有什么特别的注意事项吗?

UML 图

提前致谢

4

2 回答 2

1

自从您询问完整性检查以来,我添加了此答案。EF 中的此功能被广泛忽视。

您的 POCO 可以实施IValidatableObject

  public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 

Validate由 EF on 调用,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;
于 2013-07-17T15:07:57.590 回答
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;
    }
}
于 2013-07-17T14:49:14.887 回答