.net EF4.1、POCO、动态代理和集合

.net EF4.1、POCO、动态代理和集合,.net,entity-framework,entity-framework-4.1,poco,dynamic-proxy,.net,Entity Framework,Entity Framework 4.1,Poco,Dynamic Proxy,有没有什么特别的原因可以解释为什么在EF4.1集合中添加一个项目,将其保存到数据库中,然后再次选择该集合会产生奇怪的结果 当我进行初始加载时,集合中的所有项都属于类型System.Data.Entity.DynamicProxies.MyClassName\u LongString,因此以下对集合的选择有效: var y = MyCollection.Where(x => x.ValidTo == null).First(); 是的,集合中始终有一项符合该标准。总是 但是,如果我选择集合

有没有什么特别的原因可以解释为什么在EF4.1集合中添加一个项目,将其保存到数据库中,然后再次选择该集合会产生奇怪的结果

当我进行初始加载时,集合中的所有项都属于类型
System.Data.Entity.DynamicProxies.MyClassName\u LongString
,因此以下对集合的选择有效:

var y = MyCollection.Where(x => x.ValidTo == null).First();
是的,集合中始终有一项符合该标准。总是

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

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

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

有人知道是什么导致了这种行为吗

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

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

如果您以这种方式工作,您首先应该实际创建实体作为代理,这意味着您不使用
new
操作符,而是使用
DbSet
create
方法:

现在,
newEntity
与集合中已有的其他实体一样,是一个代理

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

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

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

如果您以这种方式工作,您首先应该实际创建实体作为代理,这意味着您不使用
new
操作符,而是使用
DbSet
create
方法:

现在,
newEntity
与集合中已有的其他实体一样,是一个代理


我不知道为什么会出现您描述的异常(可能与同一集合中的代理对象和非代理对象的混合有关),但希望在使用
Create
方法而不是
new

时,由于某种原因,使用.Create方法代替new>方法时,异常会消失,但和你一样,我也不知道为什么会这样。干杯。出于某种原因,使用.Create方法代替新的工作方法,但像你一样,我不知道为什么会这样。干杯
var newEntity = dbContext.Entities.Create();