实体框架6 - 。创建新对象,保存更改,根据新id重新查询对象,返回null

时间:2015-01-16 14:52:23

标签: c# entity-framework

我最近将我们的解决方案从EF4.1升级到EF6。我们之前的create方法将分离的对象添加到上下文中,保存更改,然后根据新的id重新获取对象。我们重新查询对象,因为我们不使用延迟加载,并使用includes / choose来获取导航属性 - 这是通过获取IDbSet并返回IQueryable来添加的。简而言之,我不能只返回现有的内存中副本 - 因为它不会被完全加载。我试过分离内存中的副本。我无法刷新dbcontext(因为我正在使用相同上下文中的其他对象)。

无论如何,最大的问题,我的重要问题是,当我重新查询该对象时,它在EF6分支中返回一个空记录 - 找不到我刚创建的那个。记录会持久保存到数据库中 - 我可以看到它。如果我为该记录创建一个新的dbcontext并查询,我可以找到它。

dbContext.Set<TEntity>().Add(model);

dbContext.SaveChanges();

var newCopy = dbContext.Set<TEntity>().SingleOrDefault(p => p.Id == model.Id);

在这种情况下,newCopy始终为null。但是如果我得到一个新的dbContext - 我可以把对象搞定。

无论如何,我需要解决这个问题。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我实际上发现了问题是什么。在EF4中,映射是HasRequired还是HasOptional并不重要。但是,如果在可以为空的整数字段(旧数据库)上使用HasRequired,那么它实际上正在执行内连接,并且不会选择记录 - 从而返回null。因为我没有使用延迟加载 - 而是急切加载 - 如果我在上面描述的映射字段上有一个include - 它返回一个null。

感谢大家的帮助 - 非常感谢!

答案 1 :(得分:0)

以下是否有效:

dbContext.Set<TEntity>().Add(model);

dbContext.SaveChanges();

var newCopy = dbContext.Set<TEntity>().Find(model.Id);

我不会声称知道其中的内容,但我在同样的情况下使用它并且有效。

您还可以检查模型属性是不是虚拟的,因为EF6将其视为延迟加载(您可能已经这样做了)。