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

时间:2012-02-21 17:17:02

标签: c# entity-framework

将子实体从一个父实体移动到另一个父实体的最佳方法是什么? 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模板。

1 个答案:

答案 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的实现,因为我认为它非常紧张。我介绍了这些方法,因为添加和删除所有权可能会在特定的人“内部”触发一些进一步的逻辑。