1

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

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

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

是的,集合中总有一个项目满足该标准。总是。

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

在该版本的集合上从上面执行相同的选择会引发空引用异常 - 即使最后一项(非动态代理项)确实符合标准,我已经通过手动观看集合来确认...

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

有谁知道是什么导致了这种行为?

4

1 回答 1

0

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

如果您使用new操作员创建新项目,则它不是代理。当您使用相同的上下文查询它时,它不会成为代理,因为 Entity Framework 检查是否已经有一个具有相同键的对象附加到对象上下文,如果是,它不会创建新的(代理)对象. 因此,您的新实体仍然是不是代理的同一对象。

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

var newEntity = dbContext.Entities.Create();

现在,newEntity是一个代理,就像您收藏中已有的其他实体一样。

我不知道为什么你会得到你描述的异常(这可能与同一集合中代理和非代理对象的混合有关)但希望当你使用该Create方法而不是new.

于 2011-11-25T23:57:59.660 回答