2013-07-17 2 views
2

Я ищу оптимальную практику поддержания двунаправленных отношений между C# POCO, которые сохраняются с Entity Framework.поддержание целостности в двунаправленных отношениях и платформа Entity Framework

Семья имеет от 0 до нескольких членов семьи, и у Личности всегда есть одна семья. Теперь, когда я создаю экземпляр нового человека и нового семейства:

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

Я бы тогда добавить человека в семье, и наоборот. Это происходит:

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

мне интересно, если есть лучший способ сделать это, потому что если я добавить человека в семье, что лица, имущество семьи всегда должен быть установлен в этой семье. Если разработчик забывает об этом, вы попадаете в объекты-сироты.

Я использую полные геттеры и сеттеры для этого? Есть ли какой-нибудь автоматизированный способ сделать это?

Существуют ли какие-либо особые соображения при использовании Entity Framework для хранения этих объектов?

UML diagram

Заранее спасибо

ответ

0

Entity структура могла бы заботиться меньше, установлен ли в другую сторону или нет, он все равно будет сохранить его правильно. Однако при использовании вашей модели домена вам может потребоваться доступ к обоим свойствам навигации сразу. Это требует установки свойства, как вы это делаете. Решение, которое я использую почти для всех навигационных коллекций, приведено ниже:

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; 
    } 
} 
+0

, которая хороша, но не мешает никому использовать непосредственно 'FamilyMembers.Add (человек)' –

+0

Изменен IEnumerable, чтобы предотвратить Добавить() –

+0

Я собираюсь принять это как ответ, кажется правильным способом сделать это, спасибо;) Любые другие мнения приветствуются! – peterrus

1

Я добавил этот ответ, так как вы задали вопрос о проверке целостности. Эта функция в EF широко игнорируется.

Вашего POCO которые могут реализовать IValidatableObject

public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 

Validate называют EF на 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; 
+0

Высоко ценится, будет реализовывать это! – peterrus

 Смежные вопросы

  • Нет связанных вопросов^_^