/// <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();
        }
Пример #2
0
        //这个方法就是把一个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);
        }