/// <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(); }
//这个方法就是把一个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); }