C# 在双向关系和实体框架中维护完整性

C# 在双向关系和实体框架中维护完整性,c#,entity-framework,bidirectional-relation,C#,Entity Framework,Bidirectional Relation,我正在寻找一种最佳实践,以维护实体框架中持久化的C#POCO之间的双向关系 一个家庭有零到多个家庭成员,一个人总是有一个家庭。现在,当我实例化一个新人和一个新家庭时: Person john = new Person(); Family adams = new Family(); 然后我会把这个人加入家庭,反之亦然。这需要: adams.familyMembers.Add(john); john.family = adams; 我想知道是否有更好的方法来做到这一点,因为如果我将一个人添加到一

我正在寻找一种最佳实践,以维护实体框架中持久化的C#POCO之间的双向关系

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

Person john = new Person();
Family adams = new Family();
然后我会把这个人加入家庭,反之亦然。这需要:

adams.familyMembers.Add(john);
john.family = adams;
我想知道是否有更好的方法来做到这一点,因为如果我将一个人添加到一个家庭中,该个人的家庭财产应该始终设置为该家庭。如果开发人员忘记了这样做,您将最终得到孤立对象

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

在使用实体框架存储这些对象时,是否有特殊的注意事项


提前感谢

实体框架可能不关心您是否设置了其他方向,它仍然会正确保存它。但是,在使用域模型时,您可能希望立即访问这两个导航属性。这需要在执行时设置属性。我用于几乎所有导航集合的解决方案如下

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;
    }
}
公共类族
{
公共家庭()
{
this.FamilyMembers=新列表();
}
公共IEnumerable FamilyMembers{get;protected set;}
public void AddFamilyMember(个人)
{
此.FamilyMembers.Add(person);
person.Family=这个;
}
}

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

您的POCO可以实现
IValidatableObject

  public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
编辑:开始使用的示例代码

 // 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;
//示例实现。
var validationResult=base.Validate(validationContext.ToList();
//validationResult.AddRange(xxx);//公共验证的小型调用示例
if(true)//导致验证错误的条件
{
var memberList=new List{“PropertyName”};//有问题的属性的名称
var error=newvalidationresult(“错误文本在此显示”,成员列表);//
validationResult.Add(错误);
}
返回验证结果;

这很好,但不会阻止任何人直接使用家庭成员。添加(个人)更改为IEnumerable以防止添加()我将接受这一回答,这似乎是一种正确的方法,谢谢;)任何其他意见都欢迎!非常感谢,我们将实施此计划!
 // 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;