EF 7 中的 db.database.ExecuteSQLCommand 等效项

Posted

技术标签:

【中文标题】EF 7 中的 db.database.ExecuteSQLCommand 等效项【英文标题】:db.database.ExecuteSQLCommand equivalent in EF 7 【发布时间】:2015-05-26 22:48:52 【问题描述】:

什么相当于

db.Database.ExecuteSqlCommand(Sql.ToString());

在实体框架 7 中?我在 beta 4 中看到了 .FromSQL(),但没有看到上述任何内容。

【问题讨论】:

更新 - 目前,ExecuteSQLCommand 可以在 Entity Framework Core 中使用。但是,您需要添加using Microsoft.EntityFrameworkCore; 【参考方案1】:

该功能尚未实现。使用问题#624 跟踪其进度。这是您现在可以使用的粗略扩展方法。

public static int ExecuteSqlCommand(this RelationalDatabase database, string sql)

    var connection = database.Connection;
    var command = connection .DbConnection.CreateCommand();
    command.CommandText = sql;

    try
    
        connection.Open();

        return command.ExecuteNonQuery();
    
    finally
    
        connection.Close();
    

像这样使用它:

db.Database.AsRelational().ExecuteSqlCommand("EXEC MySproc");

注意,这不考虑任何活跃的交易。

【讨论】:

我将在 DbContext 上创建一个扩展,读取连接字符串并使用 SqlCommand 生成单独的 SqlConnection。也许那将是我的“临时”修复:) 你应该使用“using”并放弃try catch...你不会知道这里有什么问题。接受了你的回答。扩展 RelationalDatabase 的任何原因?我扩展了 DbContext,这样你就可以使用 db.executeSql("SQL QUERY"); (刚开始使用Asp.Net 5,所以启发我^^) 更新了代码,我真的很讨厌try catch,因为它隐藏了错误:) 它不会隐藏错误——没有任何问题。它只是确保在出现错误时关闭连接。 另外,DbCommand 不打算被处置。 Dispose 方法是从 Component 派生的不幸结果。【参考方案2】:

只是想为 Entity Framework Core RC1 提供最新方法的更新。

Microsoft.Data.Entity 命名空间中的 DatabaseFacade 类有一个扩展,您可以按如下方式使用:

_dbContext.Database.ExecuteSqlCommand("EXEC MySproc");

【讨论】:

这已移至 RTM 中的 Microsoft.EntityFrameworkCore 命名空间

以上是关于EF 7 中的 db.database.ExecuteSQLCommand 等效项的主要内容,如果未能解决你的问题,请参考以下文章

在 EF Core 7 中实现强类型 ID

EF CORE 7 RC1 发布

csharp 使用EF 7.0快速保存实体

EF 7 Code First

EF 7 alpha 3:Azure 表存储

EF-LINQ查询