【问题标题】:How to set Arithabort on in Linq to Entities?如何在 Linq to Entities 中设置 Arithabort?
【发布时间】:2013-05-08 10:11:23
【问题描述】:

我找到了大量关于如何在 Linq to SQL 中设置 Arithabort 的答案,但在 Linq to Entities 中却没有。在 Linq to SQL 中,您可以这样做:

using (var conn = new SqlConnection(connectionString)){
  cmd = conn.CreateCommand();
  cmd.Connection.Open();
  cmd.CommandText = "set arithabort on;";
  cmd.ExecuteNonQuery(); // Line 5
  using (var db = new MyDataContext(conn)) {
    ...
  }
}

但如果我做同样的事情,只是在上面的代码 sn-p 中用 SqlConnection 替换 EntityConnection,我会在第 5 行得到一个运行时错误:

查询语法无效。靠近标识符“arithabort”,第 1 行,第 5 列。

我猜这与 Linq2Sql 是为 SQL Server 硬连线的事实有关,而 EF 可以在其他数据库上工作。那么有什么诀窍呢?

【问题讨论】:

标签: c# linq-to-entities entity-framework-5


【解决方案1】:

SqlConnection 并非特定于 linq-to-sql 或 EF,您仍然可以将代码与 EF 一起使用。但是您必须创建一个接收 SqlConnection 的 EntityConnection。

EntityConnection.CreateCommand 创建一个EntityCommand,它将实体 SQL 作为命令文本,没有原始 SQL 命令。

另一种方法是使用上下文的 ExecuteStoreQuery 命令 (ObjectContext) 或 context.Database.ExecuteSqlCommand (DbContext)。

【讨论】:

  • 如何创建一个“接收”SqlConnectionEntityConnection?我确实尝试使用ExecuteStoreQuery,并且运行了,但是我的查询性能仍然比在 SSMS 中运行时慢 10 倍以上,这让我认为幕后发生了某种黑魔法,仍然将 arithabort 视为关闭。
  • 存在this 过载,但由于workspace 参数,这可能不太方便。慢十倍令人惊讶,我不知道为什么会这样。
  • 您如何从ObjectContext 中获取DbContext 对象?
  • 你可以使用this构造函数。
  • 你也可以试试((EntityConnection)context.Connection).StoreConnection.CreateCommand()
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多