static void Test(EJ.Databases dbconfig) { IDatabaseDesignService dbservice = EntityDB.Design.DBHelper.CreateDatabaseDesignService((EntityDB.DatabaseType)(int) dbconfig.dbType); EntityDB.IDatabaseService db = null; dbservice.Drop(dbconfig); try { dbservice.Create(dbconfig); db = EntityDB.DBContext.CreateDatabaseService(dbconfig.conStr, (EntityDB.DatabaseType)(int) dbconfig.dbType); List <EJ.DBColumn> allColumns = new List <EJ.DBColumn>(); List <EntityDB.Design.IndexInfo> allindexes = new List <EntityDB.Design.IndexInfo>(); #region CreateTable if (true) { EJ.DBTable tableUser = new EJ.DBTable(); tableUser.Name = "User"; allColumns.Add(new EJ.DBColumn() { IsPKID = true, CanNull = false, Name = "Id", dbType = "int", IsAutoIncrement = true, }); allColumns.Add(new EJ.DBColumn() { Name = "Name", dbType = "varchar", length = "50", defaultValue = "a'b,c" }); CreateTableAction _CreateTableAction = new CreateTableAction(tableUser, allColumns.ToArray(), allindexes.ToArray()); _CreateTableAction.Invoke(db); DeleteTableAction _delaction = new DeleteTableAction(tableUser.Name); _delaction.Invoke(db); //再次创建 _CreateTableAction.Invoke(db); } #endregion allColumns.Clear(); allindexes.Clear(); allColumns.Add(new EJ.DBColumn() { IsPKID = true, CanNull = false, Name = "Id", dbType = "int", IsAutoIncrement = true, }); allColumns.Add(new EJ.DBColumn() { Name = "C1", dbType = "varchar", length = "50", defaultValue = "a'b,c" }); allColumns.Add(new EJ.DBColumn() { Name = "C2", dbType = "varchar", length = "50", defaultValue = "abc" }); allColumns.Add(new EJ.DBColumn() { Name = "C3", dbType = "int", defaultValue = "8" }); allColumns.Add(new EJ.DBColumn() { Name = "Text1", dbType = "text", }); //索引 allindexes.Add(new EntityDB.Design.IndexInfo() { ColumnNames = new string[] { "C1" }, IsUnique = true, }); allindexes.Add(new EntityDB.Design.IndexInfo() { ColumnNames = new string[] { "C2", "C3" }, }); EJ.DBTable table = new EJ.DBTable(); table.Name = "Test"; #region CreateTable if (true) { CreateTableAction _CreateTableAction = new CreateTableAction(table, allColumns.ToArray(), allindexes.ToArray()); _CreateTableAction.Invoke(db); foreach (var c in allColumns) { c.ChangedProperties.Clear(); c.BackupChangedProperties.Clear(); } checkColumns(dbservice, db, table.Name, allColumns, allindexes); } #endregion #region 测试自增长id if (true) { Way.EntityDB.CustomDataItem dataitem = new EntityDB.CustomDataItem("test", "id", null); dataitem.SetValue("c1", "C1"); dataitem.SetValue("c2", "C2"); dataitem.SetValue("c3", 3); db.Insert(dataitem); if (dataitem.GetValue("id") == null) { throw new Exception("测试自增长id失败"); } db.ExecSqlString("delete from test"); } #endregion #region ChangeTable1 if (true) { EJ.DBColumn[] newcolumns = new EJ.DBColumn[2]; newcolumns[0] = (new EJ.DBColumn() { Name = "N0", dbType = "varchar", length = "30", defaultValue = "t'b" }); newcolumns[1] = (new EJ.DBColumn() { Name = "N1", dbType = "int", defaultValue = "18" }); EJ.DBColumn[] changedColumns = new EJ.DBColumn[2]; changedColumns[0] = allColumns.FirstOrDefault(m => m.Name == "C3"); changedColumns[0].Name = "C3_changed"; changedColumns[0].dbType = "varchar"; changedColumns[0].defaultValue = "1'a"; changedColumns[0].CanNull = false; changedColumns[0].length = "88"; changedColumns[1] = allColumns.FirstOrDefault(m => m.Name == "Id"); changedColumns[1].IsAutoIncrement = false; changedColumns[1].IsPKID = false; changedColumns[1].CanNull = true; EJ.DBColumn[] deletecolumns = new EJ.DBColumn[1]; deletecolumns[0] = allColumns.FirstOrDefault(m => m.Name == "C2"); allColumns.Remove(deletecolumns[0]); allindexes.Clear(); allindexes.Add(new EntityDB.Design.IndexInfo() { ColumnNames = new string[] { "N0", "C3_changed" }, IsUnique = true, IsClustered = true }); var otherColumns = (from m in allColumns where changedColumns.Contains(m) == false select m).ToArray(); new ChangeTableAction(table.Name, "Test2", newcolumns, changedColumns, deletecolumns, otherColumns, allindexes.ToArray()) .Invoke(db); table.Name = "Test2"; allColumns.AddRange(newcolumns); foreach (var c in allColumns) { c.ChangedProperties.Clear(); c.BackupChangedProperties.Clear(); } checkColumns(dbservice, db, table.Name, allColumns, allindexes); } #endregion #region ChangeTable2 if (true) { EJ.DBColumn[] newcolumns = new EJ.DBColumn[0]; EJ.DBColumn[] changedColumns = new EJ.DBColumn[1]; changedColumns[0] = allColumns.FirstOrDefault(m => m.Name == "Id"); changedColumns[0].IsAutoIncrement = true; changedColumns[0].IsPKID = true; changedColumns[0].CanNull = false; EJ.DBColumn[] deletecolumns = new EJ.DBColumn[0]; var otherColumns = (from m in allColumns where changedColumns.Contains(m) == false select m).ToArray(); new ChangeTableAction(table.Name, "Test3", newcolumns, changedColumns, deletecolumns, otherColumns, allindexes.ToArray()) .Invoke(db); table.Name = "Test3"; allColumns.AddRange(newcolumns); foreach (var c in allColumns) { c.ChangedProperties.Clear(); c.BackupChangedProperties.Clear(); } checkColumns(dbservice, db, table.Name, allColumns, allindexes); } #endregion } catch (Exception ex) { throw ex; } finally { if (db != null) { db.DBContext.Dispose(); } } }
static void checkColumns(IDatabaseDesignService design, IDatabaseService db, string table, List <EJ.DBColumn> allcolumns, List <EntityDB.Design.IndexInfo> allindex) { var columns = design.GetCurrentColumns(db, table.ToLower()); var indexes = design.GetCurrentIndexes(db, table.ToLower()); if (allcolumns.Count != columns.Count) { throw new Exception("column 数量不一致"); } foreach (var column in allcolumns) { if (column.defaultValue == null) { column.defaultValue = ""; } var compareColumn = columns.FirstOrDefault(m => m.Name.ToLower() == column.Name.ToLower()); if (compareColumn == null) { throw new Exception("找不到字段" + column.Name); } if (compareColumn.defaultValue == null) { compareColumn.defaultValue = ""; } if (column.CanNull != compareColumn.CanNull) { throw new Exception($"column:{column.Name} CanNull 不一致"); } if (column.dbType != compareColumn.dbType) { throw new Exception($"column:{column.Name} dbType 不一致"); } if (column.defaultValue != compareColumn.defaultValue) { throw new Exception($"column:{column.Name} defaultValue 不一致 {column.defaultValue} vs {compareColumn.defaultValue}"); } if (column.IsAutoIncrement != compareColumn.IsAutoIncrement) { throw new Exception($"column:{column.Name} IsAutoIncrement 不一致"); } if (column.IsPKID != compareColumn.IsPKID) { throw new Exception($"column:{column.Name} IsPKID 不一致"); } if (column.dbType.Contains("char")) { if (column.length != compareColumn.length) { throw new Exception($"column:{column.Name} length 不一致 {column.length} vs {compareColumn.length}"); } } } if (allindex.Count != indexes.Count) { throw new Exception("index 数量不一致"); } foreach (var index in allindex) { if (indexes.Any(m => m.ColumnNames.OrderBy(n => n).ToArray().ToSplitString(",").ToLower() == index.ColumnNames.OrderBy(n => n).ToArray().ToSplitString(",").ToLower()) == false) { throw new Exception($"index:{index.Name} ColumnNames 不一致"); } if (indexes.Any(m => m.ColumnNames.OrderBy(n => n).ToArray().ToSplitString(",").ToLower() == index.ColumnNames.OrderBy(n => n).ToArray().ToSplitString(",").ToLower() && m.IsUnique == index.IsUnique) == false) { throw new Exception($"index:{index.Name} IsUnique 不一致"); } } }
public void Handle(string originalUrl, HttpConnectInformation connectInfo, ref bool handled) { if (originalUrl.Contains("/DownloadDatabaseCode.aspx") == false) { return; } handled = true; try { if (connectInfo.Session["user"] == null) { throw new Exception("not arrow"); } int databaseid = Convert.ToInt32(connectInfo.Request.Query["databaseid"]); using (EJDB db = new EJDB()) { var database = db.Databases.FirstOrDefault(m => m.id == databaseid); if (database.dllPath == null || database.dllPath.StartsWith("{") == false) { database.dllPath = Newtonsoft.Json.JsonConvert.SerializeObject(new { db = connectInfo.Request.Query["filepath"], simple = "", }); } else { var json = (Newtonsoft.Json.Linq.JToken)Newtonsoft.Json.JsonConvert.DeserializeObject(database.dllPath); json["db"] = connectInfo.Request.Query["filepath"]; database.dllPath = json.ToString(); } db.Update(database); var tables = db.DBTable.Where(m => m.DatabaseID == databaseid).ToList(); System.IO.BinaryWriter bw = new System.IO.BinaryWriter(connectInfo.Response); bw.Write("start"); var invokingDB = Way.EntityDB.Design.DBHelper.CreateInvokeDatabase(database); IDatabaseDesignService dbservice = Way.EntityDB.Design.DBHelper.CreateDatabaseDesignService((Way.EntityDB.DatabaseType)(int) database.dbType); bw.Write(1); ICodeBuilder codeBuilder = new CodeBuilder(); NamespaceCode namespaceCode = new NamespaceCode(database.NameSpace); NamespaceCode namespaceCode2 = new NamespaceCode(database.NameSpace + ".DB"); namespaceCode.AddUsing("System"); namespaceCode.AddUsing("Microsoft.EntityFrameworkCore"); namespaceCode.AddUsing("System.Collections.Generic"); namespaceCode.AddUsing("System.ComponentModel"); namespaceCode.AddUsing("System.Data"); namespaceCode.AddUsing("System.Linq"); namespaceCode.AddUsing("System.Text"); namespaceCode.AddUsing("System.ComponentModel.DataAnnotations"); namespaceCode.AddUsing("System.ComponentModel.DataAnnotations.Schema"); namespaceCode.AddUsing("Way.EntityDB.Attributes"); namespaceCode.AddUsing("System.Diagnostics.CodeAnalysis"); namespaceCode.AddBeforeCode(""); codeBuilder.BuilderDB(db, database, namespaceCode2, tables); List <string> foreignKeys = new List <string>(); foreach (var table in tables) { codeBuilder.BuildTable(db, namespaceCode, table, foreignKeys); } bw.Write("code.cs"); string code = namespaceCode.Build() + "\r\n" + namespaceCode2.Build(); byte[] bs = System.Text.Encoding.UTF8.GetBytes(code); bw.Write(bs.Length); bw.Write(bs); bw.Write(":end"); } } catch (Exception ex) { new System.IO.BinaryWriter(connectInfo.Response).Write(ex.Message); } }
public void Handle(string originalUrl, HttpConnectInformation connectInfo, ref bool handled) { if (originalUrl.Contains("/DownLoadSimpleCodeHandler.aspx") == false) { return; } handled = true; try { if (connectInfo.Session["user"] == null) { throw new Exception("not arrow"); } int databaseid = Convert.ToInt32(connectInfo.Request.Query["databaseid"]); using (EJDB db = new EJDB()) { var database = db.Databases.FirstOrDefault(m => m.id == databaseid); if (database.dllPath == null || database.dllPath.StartsWith("{") == false) { database.dllPath = Newtonsoft.Json.JsonConvert.SerializeObject(new { simple = connectInfo.Request.Query["filepath"], db = "", }); } else { var json = (Newtonsoft.Json.Linq.JToken)Newtonsoft.Json.JsonConvert.DeserializeObject(database.dllPath); json["simple"] = connectInfo.Request.Query["filepath"]; database.dllPath = json.ToString(); } db.Update(database); var tables = db.DBTable.Where(m => m.DatabaseID == databaseid).ToList(); System.IO.BinaryWriter bw = new System.IO.BinaryWriter(connectInfo.Response); bw.Write("start"); var invokingDB = Way.EntityDB.Design.DBHelper.CreateInvokeDatabase(database); IDatabaseDesignService dbservice = Way.EntityDB.Design.DBHelper.CreateDatabaseDesignService((Way.EntityDB.DatabaseType)(int) database.dbType); bw.Write(tables.Count * 1); ICodeBuilder codeBuilder = new CodeBuilder(); foreach (var table in tables) { string[] codes = codeBuilder.BuildSimpleTable(db, database.NameSpace, table); for (int i = 0; i < codes.Length; i++) { bw.Write(table.Name + "_" + i + ".cs"); byte[] bs = System.Text.Encoding.UTF8.GetBytes(codes[i]); bw.Write(bs.Length); bw.Write(bs); } } bw.Write(":end"); } } catch (Exception ex) { new System.IO.BinaryWriter(connectInfo.Response).Write(ex.Message); } }
public static void Upgrade(EntityDB.DBContext dbContext, string designData) { if (designData.IsNullOrEmpty()) { return; } byte[] bs; if (designData.StartsWith("\r\n")) { bs = System.Convert.FromBase64String(designData.Substring(2)); bs = UnGzip(bs); } else { bs = System.Convert.FromBase64String(designData); } using (var dset = Newtonsoft.Json.JsonConvert.DeserializeObject <WayDataSet>(System.Text.Encoding.UTF8.GetString(bs))) { if (dbContext == null) { return; } bs = null; EntityDB.IDatabaseService db = dbContext.Database; EntityDB.DatabaseType dbType = dbContext.DatabaseType; IDatabaseDesignService dbservice = EntityDB.Design.DBHelper.CreateDatabaseDesignService(dbType); dbservice.CreateEasyJobTable(db); var dbconfig = db.ExecSqlString("select contentConfig from __wayeasyjob").ToString().ToJsonObject <DataBaseConfig>(); if (string.IsNullOrEmpty(dbconfig.DatabaseGuid) == false && dbconfig.DatabaseGuid != dset.DataSetName) { throw new Exception("此结构脚本并不是对应此数据库"); } var dtable = dset.Tables[0]; try { var query = dtable.Rows.Where(m => (long)m["id"] > dbconfig.LastUpdatedID).OrderBy(m => (long)m["id"]).ToList(); if (query.Count > 0) { int?lastid = Convert.ToInt32(query.Last()["id"]); var assembly = typeof(Way.EntityDB.Design.Actions.CreateTableAction).GetTypeInfo().Assembly; db.DBContext.BeginTransaction(); foreach (var datarow in query) { var rowid = Convert.ToInt32(datarow["id"]); var actionItem = dataRowToAction(assembly, datarow); if (actionItem is EntityDB.Design.Actions.ChangeTableAction) { var changeAction = (EntityDB.Design.Actions.ChangeTableAction)actionItem; changeAction._getColumnsFunc = () => { List <EJ.DBColumn> allcolumns = new List <EJ.DBColumn>(); //往上逆推,查找字段信息 var datarows = dtable.Rows.Where(m => (long)m["id"] < rowid).OrderByDescending(m => (long)m["id"]).ToList(); var curTableName = changeAction.OldTableName; List <int> deletedColumnids = new List <int>(); foreach (var preRow in datarows) { var preAction = dataRowToAction(assembly, preRow); if (preAction is EntityDB.Design.Actions.CreateTableAction) { var tableAction = preAction as EntityDB.Design.Actions.CreateTableAction; if (tableAction.Table.Name != curTableName) { continue; } else { foreach (var c in tableAction.Columns) { if (allcolumns.Any(m => m.id == c.id) == false) { allcolumns.Add(c); } } break; } } else if (preAction is EntityDB.Design.Actions.ChangeTableAction) { var preChangeAction = preAction as EntityDB.Design.Actions.ChangeTableAction; if (preChangeAction.NewTableName != curTableName) { continue; } else { curTableName = preChangeAction.OldTableName; foreach (var c in preChangeAction.newColumns) { if (deletedColumnids.Contains(c.id.Value) == false && allcolumns.Any(m => m.id == c.id) == false) { allcolumns.Add(c); } } foreach (var c in preChangeAction.changedColumns) { if (deletedColumnids.Contains(c.id.Value) == false && allcolumns.Any(m => m.id == c.id) == false) { allcolumns.Add(c); } } foreach (var c in preChangeAction.deletedColumns) { deletedColumnids.Add(c.id.Value); } } } } return(allcolumns); }; } actionItem.Invoke(db); } SetLastUpdateID(lastid.Value, dset.DataSetName, db); db.DBContext.CommitTransaction(); } } catch { db.DBContext.RollbackTransaction(); throw; } } }
public static void Upgrade(EntityDB.DBContext dbContext, string designData) { if (designData.IsNullOrEmpty()) { return; } byte[] bs; if (designData.StartsWith("\r\n")) { bs = System.Convert.FromBase64String(designData.Substring(2)); bs = UnGzip(bs); } else { bs = System.Convert.FromBase64String(designData); } using (var dset = Newtonsoft.Json.JsonConvert.DeserializeObject <WayDataSet>(System.Text.Encoding.UTF8.GetString(bs))) { if (dbContext == null) { return; } bs = null; EntityDB.IDatabaseService db = dbContext.Database; EntityDB.DatabaseType dbType = dbContext.DatabaseType; IDatabaseDesignService dbservice = EntityDB.Design.DBHelper.CreateDatabaseDesignService(dbType); dbservice.CreateEasyJobTable(db); var dbconfig = db.ExecSqlString("select contentConfig from __wayeasyjob").ToString().ToJsonObject <DataBaseConfig>(); if (string.IsNullOrEmpty(dbconfig.DatabaseGuid) == false && dbconfig.DatabaseGuid != dset.DataSetName) { throw new Exception("此结构脚本并不是对应此数据库"); } var dtable = dset.Tables[0]; int currentRowId = 0; try { var query = dtable.Rows.Where(m => (long)m["id"] > dbconfig.LastUpdatedID).OrderBy(m => (long)m["id"]).ToList(); if (query.Count > 0) { var allquery = dtable.Rows.OrderBy(m => (long)m["id"]).ToList(); var assembly = typeof(Way.EntityDB.Design.Actions.CreateTableAction).GetTypeInfo().Assembly; //因为通过cs导入结构后,column的id发生变化,所以需要重新统一一下column的id for (int i = 0; i < allquery.Count; i++) { var datarow = allquery[i]; currentRowId = Convert.ToInt32(datarow["id"]); var actionItem = dataRowToAction(assembly, datarow); if (actionItem is EntityDB.Design.Actions.CreateTableAction createAction) { ResetColumnId(allquery, createAction.Table.Name, i); } } int?lastid = Convert.ToInt32(query.Last()["id"]); db.DBContext.BeginTransaction(); for (int i = 0; i < query.Count; i++) { var datarow = query[i]; currentRowId = Convert.ToInt32(datarow["id"]); var actionItem = dataRowToAction(assembly, datarow); if (actionItem is EntityDB.Design.Actions.ChangeTableAction) { var changeAction = (EntityDB.Design.Actions.ChangeTableAction)actionItem; changeAction._getColumnsFunc = () => { return(FindAllColumnsForChangeTable(assembly, changeAction, currentRowId, dtable.Rows).ToList()); }; } else if (actionItem is EntityDB.Design.Actions.CreateTableAction createAction) { //往下查找表的变更 var ret = FindCreateTableActionAllColumns(assembly, createAction, query, i + 1); if (ret == false) { //表后来删除了 query.RemoveAt(i); i--; continue; } } actionItem.Invoke(db); } SetLastUpdateID(lastid.Value, dset.DataSetName, db); db.DBContext.CommitTransaction(); } } catch (Exception ex) { db.DBContext.RollbackTransaction(); throw new Exception("发生错误,最后执行的id:" + currentRowId, ex); } } }
public static void Upgrade(EntityDB.DBContext dbContext, string designData) { if (designData.IsNullOrEmpty()) { return; } byte[] bs; if (designData.StartsWith("\r\n")) { bs = System.Convert.FromBase64String(designData.Substring(2)); bs = UnGzip(bs); } else { bs = System.Convert.FromBase64String(designData); } using (var dset = Newtonsoft.Json.JsonConvert.DeserializeObject <WayDataSet>(System.Text.Encoding.UTF8.GetString(bs))) { if (dbContext == null) { return; } bs = null; EntityDB.IDatabaseService db = dbContext.Database; EntityDB.DatabaseType dbType = dbContext.DatabaseType; IDatabaseDesignService dbservice = EntityDB.Design.DBHelper.CreateDatabaseDesignService(dbType); dbservice.CreateEasyJobTable(db); var dbconfig = db.ExecSqlString("select contentConfig from __wayeasyjob").ToString().ToJsonObject <DataBaseConfig>(); if (string.IsNullOrEmpty(dbconfig.DatabaseGuid) == false && dbconfig.DatabaseGuid != dset.DataSetName) { throw new Exception("此结构脚本并不是对应此数据库"); } var dtable = dset.Tables[0]; try { var query = dtable.Rows.Where(m => (long)m["id"] > dbconfig.LastUpdatedID).OrderBy(m => (long)m["id"]).ToList(); if (query.Count > 0) { int?lastid = Convert.ToInt32(query.Last()["id"]); var assembly = typeof(Way.EntityDB.Design.Actions.CreateTableAction).GetTypeInfo().Assembly; db.DBContext.BeginTransaction(); foreach (var datarow in query) { string actionType = datarow["type"].ToString(); string json = datarow["content"].ToString(); Type type = assembly.GetType($"Way.EntityDB.Design.Actions.{actionType}"); var actionItem = (EntityDB.Design.Actions.Action)Newtonsoft.Json.JsonConvert.DeserializeObject(json, type); actionItem.Invoke(db); } SetLastUpdateID(lastid.Value, dset.DataSetName, db); db.DBContext.CommitTransaction(); } } catch { db.DBContext.RollbackTransaction(); throw; } } }