Entity Framework 6 - . 创建新对象,保存更改,根据新 id 重新查询对象,返回 null
Posted
技术标签:
【中文标题】Entity Framework 6 - . 创建新对象,保存更改,根据新 id 重新查询对象,返回 null【英文标题】:Entity Framework 6 - .Create new object, save changes, re-query object based on new id, null return 【发布时间】:2015-01-16 14:52:22 【问题描述】:我最近将我们的解决方案从 EF4.1 升级到了 EF6。我们之前的 create 方法将分离的对象添加到上下文中,保存更改,然后根据新的 id 重新查询对象。我们重新查询对象是因为我们不使用延迟加载,并使用包含/选择来获取导航属性——这些属性是通过获取 IDbSet 并返回 IQueryable 来添加的。简而言之,我不能只返回现有的内存副本——因为它不会被完全加载。我试过分离内存中的副本。我无法刷新 dbcontext(因为我正在处理同一上下文中的其他对象)。
无论如何,大问题,我的大问题是,在 EF6 分支中,当我重新查询该对象时,它返回一个空记录 - 找不到我刚刚创建的那个。记录被持久化到数据库中——我可以看到它。如果我创建一个新的 dbcontext 并查询该记录,我可以找到它。
dbContext.Set<TEntity>().Add(model);
dbContext.SaveChanges();
var newCopy = dbContext.Set<TEntity>().SingleOrDefault(p => p.Id == model.Id);
在这种情况下,newCopy 始终为空。但是如果我得到一个新的 dbContext - 我可以很好地得到对象。
无论如何,我需要解决这个问题。有什么想法吗?
【问题讨论】:
可能不相关,但是当我将 EF 4.1 项目升级到 EF 6.1 时遇到查询问题。解决方案是针对项目中的 4.5.1-Framework。 不仅适用于 4.5。 嗨斯蒂芬 - 其他一切似乎都工作正常。我们正在使用 .NET 4.0。确实是这个重新查询问题 - 以及深度嵌套包含的一些问题。 请把代码贴出来好吗? 嗨 buffjape - 我在上面做了。我只是省略了 dbcontext 和获取集合。 dbContext.Set_context.Set<TEntity>().Find(id)
是否返回任何内容? (其中id
是一个对象)
【参考方案1】:
我实际上发现了问题所在。在 EF4 中,映射是 HasRequired 还是 HasOptional 并不重要。但是,如果您在可为空的整数字段(遗留数据库)上使用 HasRequired - 那么它实际上正在执行内部连接并且不会选择记录 - 导致返回 null。由于我没有使用延迟加载 - 而是急切加载 - 如果我在上述映射字段上有一个包含 - 它返回 null。
感谢大家的帮助 - 非常感谢!
【讨论】:
嗯... OP 中的代码没有任何.Include
扩展...所以 OP 中的代码实际上是否返回null
?
Hey dan - 为了简化我将 Set 直接放入的代码...我忘记了我的 GetSet 方法(它返回 Set)实际上对包含进行了另一个调用。正是映射的多样性吸引了我。不过,感谢您的帮助-这一切都为我指明了解决方案...当我按照上述方式尝试时,我得到了结果。【参考方案2】:
做以下工作:
dbContext.Set<TEntity>().Add(model);
dbContext.SaveChanges();
var newCopy = dbContext.Set<TEntity>().Find(model.Id);
我不会声称知道它的来龙去脉,但我在相同的情况下使用它并且它有效。
您还可以检查模型属性是否不是虚拟的,因为 EF6 将此视为延迟加载(您可能已经这样做了)。
【讨论】:
以上是关于Entity Framework 6 - . 创建新对象,保存更改,根据新 id 重新查询对象,返回 null的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 6 Recipes 2nd Edition(13-10)译 -> 显式创建代理
使用 Entity Framework 6.1 fluent API 创建唯一索引
Entity Framework 6.2.0 - 自动保存哪个用户创建或更新了 DbSet 值的 DbContext
实体未使用 Entity Framework 6 在数据库中更新