C# 在双向关系和实体框架中维护完整性
我正在寻找一种最佳实践,以维护实体框架中持久化的C#POCO之间的双向关系 一个家庭有零到多个家庭成员,一个人总是有一个家庭。现在,当我实例化一个新人和一个新家庭时: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; 我想知道是否有更好的方法来做到这一点,因为如果我将一个人添加到一
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;