1

是否有什么特别的原因为什么添加一个项目到EF4.1集合,将其保存到数据库,然后再次选择该集合会产生奇怪的结果?EF4.1,POCOS,动态代理和集合

当我做初始加载,集合中的所有项目都是一个类型System.Data.Entity.DynamicProxies.MyClassName_LongString的,所以对收集以下选择工作:

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

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

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

开始执行相同的选择集合的版本会抛出一个空引用异常 - 即使最后一个项目(非动态代理的一个)的确符合我通过观察确认的条件手动收集...

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

有没有人有什么想法造成这种行为是什么?

回答

1

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

如果使用new运算符创建新项目,则它不是代理。并且,当您使用相同的上下文查询它时,它不会成为代理,因为实体框架将检查是否已经有一个对象具有与该对象上下文相同的键,如果是,则不会创建新的(代理)对象。所以,你的新实体仍然是不是代理的同一个对象。

如果以这种方式工作,你应该实际创建实体摆在首位的代理,这意味着你不使用new运营商,而是方法的CreateDbSet<T>

var newEntity = dbContext.Entities.Create(); 

现在,newEntity是一个代理服务器,与您的收藏中已有的其他实体一样。

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

+0

出于某种原因,使用.Create方法代替新工作,但像你一样,我不知道它为什么。干杯。 – Moo