2016-07-14 37 views
0

我需要做的是這樣......爲什麼EF在分離時刪除子實體?

  1. 得到分貝上下文(UtilitiesContext)
  2. 查詢它的一些數據(看了一下目錄)
  3. 還拉從DB的孩子時,我拉WD的(AdditionalData)
  4. 處置方面
  5. 繼續使用實體

...

// step 1 
using (var db = new UtilitiesContext(false)) 
{ 
    var jsonSettings = new JsonSerializerSettings { MaxDepth = 2, ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; 

    // step 2 
    var dirs = db.GetAll<WatchedDirectory>(); 

    // step 3 (lazy load and serialize the WD and its additional data) 
    log.Debug(JsonConvert.SerializeObject(dirs, jsonSettings)); 

    foreach (var d in dirs) 
    { 
     try 
     { 
      log.Debug(" Initialising monitoring for path " + d.UNCPath); 

      // detach the object and its data items from the db 
      db.Detach(d); 
      d.AdditionalData.ForEach(i => db.Detach(i)); 

      // here the AdditionalData property serialises an empty array 
      log.Debug(JsonConvert.SerializeObject(d, jsonSettings)); 

// step 4 happens down here 

我的問題是,我得到我想要在第一日誌輸出(行標步驟3) 再後來的數據時,我再說一遍,孩子收集不見了,我所做的只是分離的實體從上下文。

我的分離方法看起來像這樣...

public void Detach(object entity) 
{ 
    Entry(entity).State = EntityState.Detached; 
} 
+0

如果你打算處理上下文,你應該先將它們映射到DTO。如果你按照你現在的路線,我相信你會有更多的問題。處理上下文作用域之外的實體對象需要解決問題。 –

+0

我也曾考慮過......這些都是非常簡單的實體,所以我認爲這樣可以節省代碼重複 – War

+0

我試過在過去做過類似的事情,它總是回來咬你屁股最後,現在更容易進行映射,而不是在稍後的時間點進行映射,在這些時間點你需要重新編寫大量的代碼,而這些代碼最終會讓你失望。 –

回答

0

EF是一個有趣的野獸,這是從上下文脫離實體最終治癒...

var jsonSettings = new JsonSerializerSettings { MaxDepth = 2, ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; 
var dirs = JsonConvert.DeserializeObject<List<WatchedDirectory>>(JsonConvert.SerializeObject(db.GetAll<WatchedDirectory>().ToList(), jsonSettings)); 

有可能更好的做法,但這個中國店的方式解決了我的問題。

0

當你從上下文中分離父實體時,你不能再使用延遲加載子實體(在你的情況下,你永遠不應該做任何事情,因爲性能會受到很大的影響)。性能更高的方法是使用includes()預先加載所需的子項。這將節省您對數據庫的額外調用。例如,如果每個家長有2個孩子,則您將爲父母進行1次呼叫,併爲每個孩子另外撥打2次電話。非常低效。

爲了反序列化某些東西,序列化某些東西的方法是一種糟糕的方法來獲取DTO。您應該進行映射(可能使用Automapper),或者關閉EF代理處理和延遲加載(具有類似效果)。

相關問題