/// <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();
            }
        }
Ejemplo n.º 2
0
        /// <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();
            }
        }
Ejemplo n.º 5
0
        //创建模型表
        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());
        }
Ejemplo n.º 7
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);
        }
Ejemplo n.º 8
0
 /// <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);
 }