【问题标题】:Convert DbContext way to SqlCommand way将 DbContext 方式转换为 SqlCommand 方式
【发布时间】:2016-11-16 08:35:06
【问题描述】:

今天我有一个使用 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; }
    }

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

SqlCommand 方式似乎使用起来更舒服(它似乎更像 PHP),但似乎将条目返回为 object。 (我读过this article

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

谢谢

【问题讨论】:

    标签: asp.net sql-server entity-framework asp.net-core


    【解决方案1】:

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

    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();
            }
        }
    }
    

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

     _dbContext.Database.ExecuteSqlCommand(sql, parameters);
    _dbContext.Database.SqlQuery<TEntity>(sql, parameters);
    

    【讨论】:

    • 您好,_dbContext.Database.SqlQuery&lt;TEntity&gt;(sql, parameters); 似乎是我要寻找的东西,但我使用的是 ASP.NET Core 1.0(所以 EF Core)并且 .SqlQuery() 不存在。代替它,我可以使用.FromSql(),是否可以使用存储过程?谢谢
    • 我觉得你可以看看this
    • 谢谢,这正是我想要的
    【解决方案2】:
        using (var connection = context.Database.GetDbConnection())
        using (var command = context.Database.GetDbConnection().CreateCommand())
        { 
           command.CommandText = string.Format(sqlQuery, id);
           connection.Open();
           using (var reader = command.ExecuteReader()){}
        }
    

    【讨论】:

      【解决方案3】:
      using (var connection = new SqlConnection(_dbContext.Database.Connection.ConnectionString))
      using (var cmd = new SqlCommand())
      {
            cmd.Connection = connection;
            cmd.CommandText = "your query here";
            cmd.CommandType = CommandType.Text;
      
            cmd.Parameters.Add("@param1", SqlDbType.Int);
      
            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
      }
      

      【讨论】:

        猜你喜欢
        • 2016-10-23
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 2018-07-03
        • 2011-09-20
        • 2022-01-19
        • 2013-02-09
        • 2010-10-27
        相关资源
        最近更新 更多