【问题标题】:Can I use DbContext.Database.SqlQuery without a strong element type in Entity Framework 6?我可以在 Entity Framework 6 中使用没有强元素类型的 DbContext.Database.SqlQuery 吗?
【发布时间】:2020-10-12 15:18:35
【问题描述】:

我正在实施一些通用的解决方案来从数据库中查询 ID。我所知道的,例如,给定一个表A,它有一个具有整数类型的列Id。不知道是uint32还是int64

我想使用DbContext.Database.SqlQuery 查询ID 的最大值,但是我不能让它以弱类型的方式工作。所以我总是必须提供一个强大的元素类型,基本上我不会喜欢它,因为它可能是intlong

如果我像.SqlQuery<object> 一样运行它,那么在尝试使用Convert.ToInt64 将其转换为例如long 时会遇到异常,说System.Object 不能转换为该类型。看来EF有点误会我了。

即使实际底层类型是Int32,并且我尝试查询long,我也会收到一个异常,指出我无法将Int32 转换为long,这对我来说完全没有意义。

我怎样才能获得一个弱类型的查询结果,我可以将其转换为我想要的任何内容?

【问题讨论】:

  • 你能不能把它转换成 varchar 然后用 C# 解析它?
  • I'd like to query the maximum of the ID 为什么?您是否尝试使用错误的 MAX+1 算法生成新 ID?这可能会产生重复的 ID,或者更糟的是,如果最后的记录被删除,则会关联不相关的记录。为什么不使用 EF 的内置身份生成机制?
  • 顺便说一句 SqlQuery 可以使用任何类型,但是如果您只想返回单个值,则不应该使用 ORM。可以使用普通的 ADO.NET 查询或例如 Dapper 来执行该查询。只是不要使用 MAX+1。您可以在 EF 中指定备用 ID 生成策略。如果您想提前知道 ID,更好的解决方案是使用 SEQUENCE
  • 只是.SqlQuery<long>(...) DB 类型与 C# 类型不同,所以 对于查询 重要的是,要有一个足够大的目标类型来保存结果
  • @grek40 感谢您的评论,是的,这就是为什么我很惊讶long 不适合int

标签: c# entity-framework entity-framework-6


【解决方案1】:

不幸的是,Entity Framework 旨在映射definite (strong typed) POCO classes

类型和每个映射属性的名称必须相同。

  • 您可以使用those techniqueslong 转换为int。但这也需要您事先了解列类型。
  • 您可以使用codes shown here 转换为dynamic 类型。但与 IMO 的 ADO.NET 相比,这太过分了。

【讨论】:

  • 感谢您总结结论的回答,我将使用纯 ADO API。
猜你喜欢
  • 2020-02-11
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多