2016-07-14 62 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代理处理和延迟加载(具有类似效果)。

相关问题