繁体   English   中英

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

[英]Move child entities to a new parent entity

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

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

public class Car
{
   public int CarId
   public string Color
}

编辑:我目前首先使用 EF 4.0 model 和 POCO 模板。

我想说你想要完成的是在这个例子中改变车主 如果没有严重的缺点反对添加对Car中的Person的反向引用,我会使用类似以下内容的 go:

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
   }
}

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

编辑:如果不可能添加对Person的反向引用,从域逻辑的角度来看,您仍然有相同的目标。 你只是想改变一辆车的主人。 这样的操作涉及两个实体,所以我可能会 go 使用放置在实体外部某处的方法(无论它应该放置在设计良好的系统中的哪个位置):

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

使用现代 EFCore,您可以非常简单地通过附加新的父实体来完成此操作,其中包含具有 ID 的子实体。 它将重新分配孩子的FK(如果没有指定ID,则创建它),并创建新的Person,全部在一个go

前任:

var newOwner = new Person { 
    Cars = new List<Car> { 
        new Car { carId = theCarToMove.carId } 
    } 
};
Context.Attach(newOwner);
await Context.SaveChangesAsync();

请注意,如果您的 Context 不是真正的瞬态,则 Attach 可能会导致问题,但作为创可贴,您始终可以在尝试 Attach 之前清除 ChangeTracker

对不起,我看不到这个简单的解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM