是否有任何特殊原因可以将项目添加到EF4.1集合中,将其保存到数据库然后再次选择该集合会产生奇怪的结果?
当我进行初始加载时,集合中的所有项都是System.Data.Entity.DynamicProxies.MyClassName_LongString
类型,因此集合中的以下选择有效:
var y = MyCollection.Where(x => x.ValidTo == null).First();
是的,集合中始终有一个符合该标准的项目。总是
但是,如果我选择集合,添加一个新项目,保存更改,然后在同一个上下文中再次选择集合,集合中的最后一项(新项目)不是动态代理,而是我的POCO类型(Moo.Model.MyClassName
)。
在上执行与上面相同的选择版本的集合会引发空引用异常 - 即使最后一项(非动态代理一项)确实符合条件,我通过手动观看收集确认...
在更改之后从其他上下文加载集合,并且行为不会显示自身 - 它们都是动态代理,并且选择有效。
有没有人知道造成这种行为的原因是什么?
答案 0 :(得分:1)
但是,如果我选择集合,请向其添加新项目,保存 更改然后在相同的上下文中再次选择集合 集合中的最后一项(新项目)不是动态代理,而是 而是我的POCO类型(Moo.Model.MyClassName)。
如果使用new
运算符创建新项目,则它不是代理。当您使用相同的上下文查询它时它不会成为代理,因为实体框架检查是否已经有一个对象附加到对象上下文的对象,如果是,它不会创建一个新的(代理)对象。因此,您的新实体仍然是不是代理的同一对象。
如果您以这种方式工作,您实际上应该首先将实体创建为代理,这意味着您不使用new
运算符,而是使用Create
DbSet<T>
方法}}:
var newEntity = dbContext.Entities.Create();
现在,newEntity
就像您集合中已有的其他实体一样。
我不知道你为何会得到你所描述的异常(这可能与同一集合中代理和非代理对象的混合有关)但希望它在你使用{{1 }}方法而不是Create
。