2012-02-21 59 views
2

將子實體從一個父實體移動到另一個實體的最佳方式是什麼? ObjectContext或DbContext裏面有一個方法可以讓我們完成這個任務嗎?將子實體移動到新的父實體

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

public class Car 
{ 
    public int CarId 
    public string Color 
} 

編輯:我目前使用EF 4.0模型第一次與POCO模板。

+0

非常依賴於你如何使用EF(例如代碼優先,模式優先等)......你使用POCO,代理等等。如果您使用模板生成的實體或代理,您應該能夠更改內存中的關係並保存。 – 2012-02-21 17:23:31

+0

@JamesGaunt:謝謝James,我編輯了我的問題。 – madatanic 2012-02-21 17:25:38

+0

您是否嘗試從一個集合中刪除並添加到另一個集合中? – usr 2012-02-21 17:51:53

回答

2

我想說你想完成的是在這個例子中改變車的車主

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

注意:如果有反對加在Car一個反向引用Person沒有嚴重的缺點我會喜歡的東西去保護二傳手是執行調用外部消費者ChangeOwner方法。 EF將能夠正確設置它,這要歸功於POCO類的自動生成代理(假設您使用它們)。

編輯: 如果不可能添加對Person的反向引用,則從域邏輯角度看,您仍然有相同的目標。你只是想換一輛車的車主。這樣的操作包括兩個entites的,所以我很可能某處放置實體(無論它應該被放置在一個精心設計的系統)之外的方法去:

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的實現,因爲我認爲它非常好。我介紹了這些方法,因爲增加和刪除所有權可能會在特定人員的「內部」引發更多邏輯。

+0

如果汽車沒有導航屬性所有者,你會如何處理這個問題? – madatanic 2012-02-23 00:26:32

+0

請查看我的編輯。 – dmusial 2012-02-23 22:28:45

+0

所以基本上,你從一個人中刪除「汽車」並將該汽車添加到另一個人。這就是我最終做的。 – madatanic 2012-02-24 22:58:27

相關問題