[英]Can I configure Fluent NHibernate to move all child entities of deleted parent to new parent?
[英]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.