将子实体移动到新的父实体

将子实体从一个父实体移动到另一个父实体的最佳方法是什么? ObjectContext或DbContext中是否有一个允许我们完成此操作的方法?

public class Person { public int PersonId public ICollection Cars } public class Car { public int CarId public string Color } 

编辑:我目前正在使用EF 4.0模型首先使用POCO模板。

我想说你想要完成的是在这个例子中改变汽车的拥有者 。 如果没有严重的弊端反对在Car中添加对Person的反向引用,我会选择以下内容:

 public class Car { ... public virtual Person Owner { get; protected set; } public void ChangeOwner(Person newOwner) { // perform validation and then Owner = newOwner; // maybe perform some further domain-specific logic } } 

注意:受保护的setter将强制外部使用者调用ChangeOwner方法。 由于POCO类的自动生成代理(假设您使用它们),EF将能够正确设置它。

编辑:如果没有可能向Person添加后向引用,那么从域逻辑角度来看,您仍然有相同的目标。 你只想改变汽车的拥有者。 这样的操作涉及两个实体,所以我可能会在实体之外的某个地方放置一个方法(无论它应该放在一个设计良好的系统中):

 public void ChangeCarOwner(Person originalOwner, Person newOwner, int carId) { Car car = originalOwner.RemoveCarOwnership(carId); newOwner.AddCarOwnership(car); } public class Person { ... public Car RemoveCarOwnership(int carId) { Car car = this.Cars.Single(c => c.Id == carId); this.Cars.Remove(car); return car; } } 

这只是一个概念性的代码片段,它肯定可以更好地编写(确保老拥有者实际上拥有汽车等),但我只想提出一个如何处理它的想法。 我也无视AddCarOwnership的实现,因为我认为它非常紧张。 我介绍了那些方法,因为添加和删除所有权可能会触发一些特定人“内部”的逻辑。