EF4.1,POCOS,动态代理和集合

时间:2011-11-25 18:04:43

标签: .net entity-framework entity-framework-4.1 poco dynamic-proxy

是否有任何特殊原因可以将项目添加到EF4.1集合中,将其保存到数据库然后再次选择该集合会产生奇怪的结果?

当我进行初始加载时,集合中的所有项都是System.Data.Entity.DynamicProxies.MyClassName_LongString类型,因此集合中的以下选择有效:

var y = MyCollection.Where(x => x.ValidTo == null).First();

是的,集合中始终有一个符合该标准的项目。总是

但是,如果我选择集合,添加一个新项目,保存更改,然后在同一个上下文中再次选择集合,集合中的最后一项(新项目)不是动态代理,而是我的POCO类型(Moo.Model.MyClassName)。

上执行与上面相同的选择版本的集合会引发空引用异常 - 即使最后一项(非动态代理一项)确实符合条件,我通过手动观看收集确认...

在更改之后从其他上下文加载集合,并且行为不会显示自身 - 它们都是动态代理,并且选择有效。

有没有人知道造成这种行为的原因是什么?

1 个答案:

答案 0 :(得分:1)

  

但是,如果我选择集合,请向其添加新项目,保存   更改然后在相同的上下文中再次选择集合   集合中的最后一项(新项目)不是动态代理,而是   而是我的POCO类型(Moo.Model.MyClassName)。

如果使用new运算符创建新项目,则它不是代理。当您使用相同的上下文查询它时它不会成​​为代理,因为实体框架检查是否已经有一个对象附加到对象上下文的对象,如果是,它不会创建一个新的(代理)对象。因此,您的新实体仍然是不是代理的同一对象。

如果您以这种方式工作,您实际上应该首先将实体创建为代理,这意味着您不使用new运算符,而是使用Create DbSet<T>方法}}:

var newEntity = dbContext.Entities.Create();

现在,newEntity就像您集合中已有的其他实体一样。

我不知道你为何会得到你所描述的异常(这可能与同一集合中代理和非代理对象的混合有关)但希望它在你使用{{1 }}方法而不是Create