实体框架以一对多替换集合的正确方法

Geo*_*uer 11 c# mapping orm entity-framework entity-framework-6

假设客户有许多电话号码,而电话号码只有一个客户.

public class PhoneNumber : IValueObject {
  public string Number {get; set;}
  public string Type {get; set;}
}

public class Customer : IEntity {
   public ICollection<PhoneNumber> phones {get; private set;} //ew at no encapsulated collection support
   public void SetPhones(params PhoneNumber[] phones) {
       this.phones.Clear();
       this.phones.AddRange(phones);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果我像这样进行EF映射并运行它,每次设置电话号码都会创建新的PhoneNumbers但不删除旧的.没有其他实体引用电话号码,我甚至没有在我的dbcontext上公开它,有没有办法告诉EF 完全Customer拥有PhoneNumbers,因此如果从集合中删除了电话号码,他们应该被删除?

证明

我意识到有十几种方法来解决这个问题,但这不是一个奇怪的边缘情况,处理这个问题的"正确"方法是什么.

Qui*_*ith 11

我有完全相同的问题:)

关于识别关系的答案解决了我的问题.

注意:您必须加载集合(热切,明确或懒惰),以便在设置新值和调用save之前跟踪它.否则你不会更换集合,只是添加它.

例如:

var entity = unitOfWork.EntityRepository.GetById(model.Id);
// I have something like this to load collection because
// I don't have the collection's entities exposed to the context
unitOfWork.EntityRepository.LoadCollection(entity, e => e.CollectionProperty);
entity.CollectionProperty = newCollectionValuesList;
unitOfWork.Save();
Run Code Online (Sandbox Code Playgroud)

这将从"集合表"中删除以前的集合值,并仅添加新设置的值.

希望有所帮助.