![](/img/trans.png)
[英]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.