/// <summary> /// 把model生成快照 /// </summary> /// <param name="_dbContext">efcontent</param> /// <param name="nameSpace">快照类的空间名称</param> /// <param name="className">快照类的名称</param> /// <returns></returns> private static string ModelSnapshotToString(EfContent _dbContext, string nameSpace, string className) { var snapshotCode = new DesignTimeServicesBuilder(typeof(EfContent).Assembly, Assembly.GetEntryAssembly(), new OperationReporter(new OperationReportHandler()), new string[0]) .Build((DbContext)_dbContext) .GetService <IMigrationsCodeGenerator>() .GenerateSnapshot(nameSpace, typeof(EfContent), className, _dbContext.Model);//modelSnapshotNamespace:给动态生成类添加nameplace(必须和当前代码所在的命名控件下或者一样)modelSnapshotName:动态生成类的名称 return(snapshotCode); }
/// <summary> /// 执行sql返回datatable /// </summary> /// <param name="efcontent"></param> /// <param name="sql"></param> /// <param name="commandParameters"></param> /// <returns></returns> public static DataTable SqlQuery(this EfContent efcontent, string sql, params object[] commandParameters) { var dt = new DataTable(); using (var connection = efcontent.Database.GetDbConnection()) { using (var cmd = connection.CreateCommand()) { efcontent.Database.OpenConnection(); cmd.CommandText = sql; if (commandParameters != null && commandParameters.Length > 0) { cmd.Parameters.AddRange(commandParameters); } using (var reader = cmd.ExecuteReader()) { dt.Load(reader); } } } return(dt); }
/// <summary> /// 执行多条sql /// </summary> /// <param name="efcontent"></param> /// <param name="sqlList"></param> public static int ExecuteListSqlCommand(this EfContent efcontent, List <string> sqlList) { int retunInt = 0; try { using (var trans = efcontent.Database.BeginTransaction()) { sqlList.ForEach(cmd => retunInt += efcontent.Database.ExecuteSqlCommand(cmd)); efcontent.Database.CommitTransaction(); } } catch (DbException ex) { try { efcontent.Database.RollbackTransaction(); } catch (DbException) { } } return(retunInt); }
/// <summary> /// 给EfContent添加的更新数据库结构的方法 /// </summary> public static void RunUpdateDataBaseEntity(this EfContent _dbContext) { // 创建一个DbContext,具体方法怎样都行 IModel lastModel = null; try { // 读取迁移记录,把快照还原会model var lastMigration = _dbContext.Set <MigrationLog>() .OrderByDescending(e => e.Id) .FirstOrDefault(); lastModel = lastMigration == null ? null : (CreateModelSnapshot(lastMigration.SnapshotDefine, "ApiHost.Migrations", "EfContentModelSnapshot")?.Model); } catch (DbException) { } var modelDiffer = _dbContext.Database.GetService <IMigrationsModelDiffer>(); //判断是否有更改 if (modelDiffer.HasDifferences(lastModel, _dbContext.Model)) { // 用 IMigrationsModelDiffer 的 GetDifferences 方法获取迁移的操作对象 var upOperations = modelDiffer.GetDifferences(lastModel, _dbContext.Model); //执行迁移 Migrationing(upOperations, _dbContext); // 生成新的快照,存起来 var snapshotCode = ModelSnapshotToString(_dbContext, "ApiHost.Migrations", "EfContentModelSnapshot"); _dbContext.Set <MigrationLog>().Add(new MigrationLog() { SnapshotDefine = snapshotCode, MigrationTime = DateTime.Now }); _dbContext.SaveChanges(); } }
/// <summary> /// 执行sql返回list /// </summary> /// <typeparam name="T"></typeparam> /// <param name="efcontent"></param> /// <param name="sql"></param> /// <param name="parameters"></param> /// <returns></returns> public static List <T> SqlQuery <T>(this EfContent efcontent, string sql, params object[] parameters) where T : class, new() { var dt = SqlQuery(efcontent, sql, parameters); return(dt.ToList <T>()); }
/// <summary> /// 迁移数据库结构 /// </summary> /// <param name="upOperations"></param> /// <param name="_dbContext"></param> private static void Migrationing(IReadOnlyList <MigrationOperation> upOperations, EfContent _dbContext) { List <string> sqlChangeColumNameList = new List <string>(); List <MigrationOperation> list = new List <MigrationOperation>(); //执行迁移列名修改 foreach (var upOperation in upOperations) { if (upOperation is RenameColumnOperation) { sqlChangeColumNameList.Add(RenameColumnOperationToSql(upOperation as RenameColumnOperation, _dbContext)); } else { list.Add(upOperation); } } int columChangeCount = _dbContext.ExecuteListSqlCommand(sqlChangeColumNameList); //处理剩余迁移 if (list.Count > 0) { //通过 IMigrationsSqlGenerator 将操作迁移操作对象生成迁移的sql脚本,并执行 var sqlList = _dbContext.Database.GetService <IMigrationsSqlGenerator>() .Generate(list, _dbContext.Model) .Select(p => p.CommandText).ToList(); int changeCount = _dbContext.ExecuteListSqlCommand(sqlList); } }
/// <summary> /// 把RenameColumnOperation该字段转换成sql /// </summary> /// <param name="renameColumnOperation"></param> /// <returns></returns> private static string RenameColumnOperationToSql(RenameColumnOperation renameColumnOperation, EfContent _dbContext) { string column_type = string.Empty; string sql = "select column_type from information_schema.columns where table_name='" + (renameColumnOperation as RenameColumnOperation).Table + "' and column_name='" + (renameColumnOperation as RenameColumnOperation).Name + "'"; var dataTable = _dbContext.SqlQuery(sql); if (dataTable != null && dataTable.Rows.Count > 0) { column_type = dataTable.Rows[0].ItemArray[0].ToString(); } return("alter table " + (renameColumnOperation as RenameColumnOperation).Table + " change column " + (renameColumnOperation as RenameColumnOperation).Name + " " + (renameColumnOperation as RenameColumnOperation).NewName + " " + column_type + " ;"); }