【问题标题】:Move child entities to a new parent entity将子实体移动到新的父实体
【发布时间】:2012-03-12 00:37:13
【问题描述】:

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

public class Person
{
   public int PersonId
   public ICollection<Car> Cars
}

public class Car
{
   public int CarId
   public string Color
}

编辑:我目前首先使用带有 POCO 模板的 EF 4.0 模型。

【问题讨论】:

  • 很大程度上取决于您如何使用 EF(例如代码优先、模式优先等)...您是否使用 POCO、代理等。如果您使用的是模板生成的实体或代理,您应该能够更改内存中的关系并保存。
  • @JamesGaunt:谢谢詹姆斯,我已经编辑了我的问题。
  • 您是否尝试从一个集合中删除并添加到另一个集合?
  • @usr:我还没试过。我只是想从观众那里获得意见,以及最佳实践。
  • 如果您将 POCO 与代理一起使用,那么您正确的做法是在内存中编辑集合并保存。如果您不使用代理 - 您可以要求框架手动检测更改 (context.DetectChanges())。

标签: c# entity-framework


【解决方案1】:

我想说的是,在这个示例中,您想要完成的是更改车主。如果在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 的实现,因为我想它非常紧张。我介绍了这些方法,因为添加和删除所有权可能会触发特定人“内部”的一些进一步逻辑。

【讨论】:

  • 如果 Car 没有导航属性 Owner,您将如何处理?
  • 所以基本上,您从一个人身上删除“汽车”,然后将该汽车添加给另一个人。这就是我最终所做的。
  • 如果您启用了延迟加载(默认情况下),那么this.Cars.Remove(car); 的副作用是它将从数据库中加载此人拥有的所有汽车。需要注意这一点,因为在某些情况下它可能会成为性能问题。
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 2011-12-19
  • 1970-01-01
  • 2011-09-02
  • 2013-07-24
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多