将 DbContext 方式转换为 SqlCommand 方式

Vic*_*tro 0 sql-server asp.net entity-framework asp.net-core

今天,我有一个使用 EF Core 和 DbContext 类工作的应用程序,如下所示:

    public class RcoreContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=rCoreData.TestDb;Trusted_Connection=True;");
        }

        public DbSet<Hosts> Hosts { get; set; }
        public DbSet<Route> Route { get; set; }
    }

    public class Hosts
    {
        public int      HostsId  { get; set; }
        public string   Host     { get; set; }

        [NotMapped]
        public Dictionary<object, object> Datas { get; set; }

        public string   DatasJson { get { return JsonConvert.SerializeObject(Datas); } set { Datas = JsonConvert.DeserializeObject<Dictionary<object, object>>(value); } }
    }

    public class Route
    {
        public int                          RouteId     { get; set; }
        public int                          HostId      { get; set; }
        public string                       RealRoute   { get; set; }
        public string                       alias       { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我非常喜欢这种方式,因为请求返回基于现有类(Hosts以及Route在此代码中)。

SqlCommand 方式似乎更易于使用(它似乎更像 PHP),但似乎将条目返回为object. (我读过这篇文章)

我想知道是否有可能在这两种方式之间进行混合,并像 SqlCommand 一样将请求作为 StoredProcedure 发送,但仍然基于请求返回的现有类。

谢谢

Win*_*son 5

如果你想在 EF 中使用 ADO.NET,你只需要获取当前的连接字符串并创建 sqlcommand 如下:

using (var context = new RcoreContext())
{
   // creates a Command 
   var command = context.Database.Connection.CreateCommand();
   command.CommandType = commandType;
   command.CommandText = sql;

   using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
        for (int i = 0; i < reader.FieldCount; i++)
        {
            Console.WriteLine(reader.GetValue(i));
        }
        Console.WriteLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你只是想执行 sql 或存储过程,你也可以在 EF 中使用下面

 _dbContext.Database.ExecuteSqlCommand(sql, parameters);
_dbContext.Database.SqlQuery<TEntity>(sql, parameters);
Run Code Online (Sandbox Code Playgroud)

  • 我觉得你可以看看[这个](http://dotnetthoughts.net/how-to-execute-storedprocedure-in-ef-core/) (2认同)