[英]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来做到这一点? 有一些自动的方法可以做到这一点吗?
使用实体框架存储这些对象时,有什么特别的注意事项吗?
提前致谢
因为您询问完整性检查,所以我添加了此答案。 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.