簡體   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