将子实体从一个父实体移动到另一个父实体的最佳方法是什么? ObjectContext或DbContext中是否有一个允许我们完成此操作的方法?
public class Person
{
public int PersonId
public ICollection<Car> Cars
}
public class Car
{
public int CarId
public string Color
}
编辑:我目前正在使用EF 4.0模型,先使用POCO模板。
答案 0 :(得分:2)
在这个例子中,我想说你要完成的是更改汽车的拥有者。如果在Person
中添加对Car
的反向引用没有严重的缺点,我会选择以下内容:
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
的实现,因为我认为它非常紧张。我介绍了这些方法,因为添加和删除所有权可能会在特定的人“内部”触发一些进一步的逻辑。