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().Add(Model); dbContext.SaveChanges(); dbContext.Set().SingleOrDefault(p => p.Id = Model.Id);旁注:我也尝试过 where - 除了新的 dbContext 之外,没有任何东西可以查询对象。 _context.Set&lt;TEntity&gt;().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 在数据库中更新

Entity Framework 6 - . 创建新对象,保存更改,根据新 id 重新查询对象,返回 null

如何在 Entity Framework 6 中以编程方式创建与 MS SQL 的连接字符串?