/// <summary> /// 添加字段 /// </summary> /// <param name="context"></param> /// <param name="model"></param> /// <param name="property"></param> public static void AddField(this DynamicModelDbContext context, RuntimeModelMeta model, RuntimeModelMeta.ModelPropertyMeta property) { using (DbConnection conn = context.Database.GetDbConnection()) { if (conn.State != System.Data.ConnectionState.Open) { conn.Open(); } DbCommand addFieldCmd = conn.CreateCommand(); addFieldCmd.CommandText = $"alert table {model.ClassName} add {property.PropertyName} "; switch (property.ValueType) { case "int": addFieldCmd.CommandText += "int"; break; case "datetime": addFieldCmd.CommandText += "datetime"; break; case "bool": addFieldCmd.CommandText += "bit"; break; default: addFieldCmd.CommandText += "nvarchar(max)"; break; } addFieldCmd.ExecuteNonQuery(); } }
/// <summary> /// 反序列化获得集合 /// </summary> /// <param name="meta"></param> /// <returns></returns> public static RuntimeModelMeta.ModelPropertyMeta[] GetProperties(this RuntimeModelMeta meta) { if (string.IsNullOrEmpty(meta.Properties)) { return(null); } return(JsonConvert.DeserializeObject <RuntimeModelMeta.ModelPropertyMeta[]>(meta.Properties)); }
/// <summary> /// 创建模型表(sql server) /// </summary> /// <param name="context"></param> /// <param name="model"></param> public static void CreateModel(this DynamicModelDbContext context, RuntimeModelMeta model) { DbConnection conn = context.Database.GetDbConnection(); if (conn.State != System.Data.ConnectionState.Open) { conn.Open(); } DbCommand createTableCmd = conn.CreateCommand(); createTableCmd.CommandText = $"create table {model.ClassName}"; createTableCmd.CommandText += "(id int identity(1,1)"; foreach (var p in model.GetProperties()) { createTableCmd.CommandText += $",{p.PropertyName} "; switch (p.ValueType) { case "int": createTableCmd.CommandText += "int"; break; case "datetime": createTableCmd.CommandText += "datetime"; break; case "bool": createTableCmd.CommandText += "bit"; break; case "timestamp": createTableCmd.CommandText += "timestamp"; break; case "string": if (p.Length != 0) { createTableCmd.CommandText += "nvarchar(" + p.Length + ")"; } else { createTableCmd.CommandText += "nvarchar(max)"; } break; default: createTableCmd.CommandText += "nvarchar(max)"; break; } } createTableCmd.CommandText += ")"; createTableCmd.ExecuteNonQuery(); }
/// <summary> /// 删除字段 /// </summary> /// <param name="context"></param> /// <param name="model"></param> /// <param name="property"></param> public static void RemoveField(this DynamicModelDbContext context, RuntimeModelMeta model, string property) { using (DbConnection conn = context.Database.GetDbConnection()) { if (conn.State != System.Data.ConnectionState.Open) { conn.Open(); } DbCommand removeFieldCmd = conn.CreateCommand(); removeFieldCmd.CommandText = $"alert table {model.ClassName} DROP COLUMN {property}"; removeFieldCmd.ExecuteNonQuery(); } }
//创建模型表 public static void CreateModel(this ModelDbContext context, RuntimeModelMeta model) { using (DbConnection conn = context.Database.GetDbConnection()) { if (conn.State != System.Data.ConnectionState.Open) { conn.Open(); } DbCommand createTableCmd = conn.CreateCommand(); createTableCmd.CommandText = $"create table {model.ClassName}"; createTableCmd.CommandText += "{id int identity(1,1)"; foreach (var p in model.Properties) { createTableCmd.CommandText += $",{p.PropertyName} "; switch (p.ValueType) { case "int": createTableCmd.CommandText += "int"; break; case "datetime": createTableCmd.CommandText += "datetime"; break; case "bool": createTableCmd.CommandText += "bit"; break; default: createTableCmd.CommandText += "nvarchar(max)"; break; } } createTableCmd.CommandText += "}"; createTableCmd.ExecuteNonQuery(); } }
public IActionResult Index() { List <RuntimeModelMeta.ModelPropertyMeta> modelmeta = new List <RuntimeModelMeta.ModelPropertyMeta>(); modelmeta.Add(new RuntimeModelMeta.ModelPropertyMeta() { Id = 1, PropertyName = "Size", Name = "尺寸", ValueType = "string", Length = 20 }); modelmeta.Add(new RuntimeModelMeta.ModelPropertyMeta() { Id = 2, PropertyName = "Name", Name = "名称", ValueType = "string", Length = 20 }); modelmeta.Add(new RuntimeModelMeta.ModelPropertyMeta() { Id = 3, PropertyName = "Color", Name = "颜色", ValueType = "string", Length = 20 }); modelmeta.Add(new RuntimeModelMeta.ModelPropertyMeta() { Id = 4, PropertyName = "Version", Name = "版本", ValueType = "timestamp" }); var s = JsonConvert.SerializeObject(modelmeta); RuntimeModelMeta meta = new RuntimeModelMeta(); meta.ClassName = "BareDiamond"; meta.ModelName = "BareDiamond"; meta.Properties = s; _modeldbContext.Add(meta); _modeldbContext.SaveChanges(); foreach (var item in _modeldbContext.Metas) { _dbContext.CreateModel(item); } Type modelType = _privader.GetType(1); //获取id=1的模型类型 object obj = Activator.CreateInstance(modelType); //创建实体 var entity = obj as DynamicEntity; //类型转换,目的是进行赋值 entity["Id"] = 1; entity["Name"] = "名称"; entity["Size"] = "10*20"; entity["Color"] = "red"; _dbContext.Add(entity); _dbContext.SaveChanges(); return(View()); }
//这个方法就是把一个RuntimeModelMeta转换成更接近类结构的TypeMeta对象 private TypeMeta GetTypeMetaFromModelMeta(RuntimeModelMeta meta) { TypeMeta typeMeta = new TypeMeta(); //我们让所有的动态类型都继承自DynamicEntity类,这个类主要是为了方便属性数据的读取,具体代码看后面 typeMeta.BaseType = typeof(DynamicEntity); typeMeta.TypeName = meta.ClassName; foreach (var item in meta.GetProperties()) { TypeMeta.TypePropertyMeta pmeta = new TypeMeta.TypePropertyMeta(); pmeta.PropertyName = item.PropertyName; //如果必须输入数据,我们在属性上增加RequireAttribute特性,这样方便我们进行数据验证 if (item.IsRequired) { TypeMeta.AttributeMeta am = new TypeMeta.AttributeMeta(); am.AttributeType = typeof(RequiredAttribute); am.Properties = new string[] { "ErrorMessage" }; am.PropertyValues = new object[] { "请输入" + item.Name }; pmeta.AttributeMetas.Add(am); } if (item.ValueType == "string") { pmeta.PropertyType = typeof(string); TypeMeta.AttributeMeta am = new TypeMeta.AttributeMeta(); //增加长度验证特性 am.AttributeType = typeof(StringLengthAttribute); am.ConstructorArgTypes = new Type[] { typeof(int) }; am.ConstructorArgValues = new object[] { item.Length }; am.Properties = new string[] { "ErrorMessage" }; am.PropertyValues = new object[] { item.Name + "长度不能超过" + item.Length.ToString() + "个字符" }; pmeta.AttributeMetas.Add(am); } else if (item.ValueType == "int") { if (!item.IsRequired) { pmeta.PropertyType = typeof(int?); } else { pmeta.PropertyType = typeof(int); } } else if (item.ValueType == "datetime") { if (!item.IsRequired) { pmeta.PropertyType = typeof(DateTime?); } else { pmeta.PropertyType = typeof(DateTime); } } else if (item.ValueType == "bool") { if (!item.IsRequired) { pmeta.PropertyType = typeof(bool?); } else { pmeta.PropertyType = typeof(bool); } } else if (item.ValueType == "timestamp") { pmeta.PropertyType = typeof(byte[]); } typeMeta.PropertyMetas.Add(pmeta); } return(typeMeta); }
/// <summary> /// 把集合序列化成字符串,用于保存 /// </summary> /// <param name="meta"></param> /// <param name="properties"></param> public static void SetProperties(this RuntimeModelMeta meta, RuntimeModelMeta.ModelPropertyMeta[] properties) { meta.Properties = JsonConvert.SerializeObject(properties); }