比EntityFramework简单很多的SOD框架动态创建表的方法

今天看到一篇博文EntityFramework Core如何映射动态模型?  ,文章讲的是如何用EF动态创建表的问题,比如根据时间动态创建一个表,这种场景常出现在应用系统的日志记录功能中。原文用EF实现非常复杂,相比而言,SOD框架就要简单很多。

下面直接给出SOD框架的方案。

public class User : EntityBase
    {
        public User()
        {
            TableName="Tb_User";
           
            IdentityName = "UserID";
            PrimaryKeys.Add("UserID");
        }

        /// <summary>
        /// 设置字段名数组,如果不实现该方法,框架会自动反射获取到字段名数组,因此从效率考虑,建议实现该方法
        /// </summary>
        protected override void SetFieldNames()
        {
            PropertyNames = new string[] { "UserID", "Name", "Pwd", "RegistedDate" };
        }

        public int ID
        {
            get { return getProperty<int>("UserID"); }
            set { setProperty("UserID", value); }
        }

        public string Name
        {
            get { return getProperty<string>("Name"); }
            set { setProperty("Name", value, 50); }
        }

        public string Pwd
        {
            get { return getProperty<string>("Pwd"); }
            set { setProperty("Pwd", value, 50); }
        }

        public DateTime RegistedDate
        {
            get { return getProperty<DateTime>("RegistedDate"); }
            set { setProperty("RegistedDate", value); }
        }

//重写 GetTableName,实现分表方法
 public override string GetTableName()
 {
   if (this.ID < 1000)
     return "Users";
   else if (this.ID < 2000)
     return "Users1000"; //分表
   else
     Schema = "DbPart1].[dbo"; //指定架构分库
   return "Users2000";
 }

}


public class LocalDbContext : DbContext  
    {
        public LocalDbContext()
            : base("local")
        {
            //local 是App.config/Web.config 配置文件连接字符串的名字
            //在命令管道中注册日志处理器和Oracle命令处理器
            //base.CurrentDataBase.RegisterCommandHandle(new CommandExecuteLogHandle());
            //base.CurrentDataBase.RegisterCommandHandle(new OracleCommandHandle());
        }

        #region 父类抽象方法的实现

        protected override bool CheckAllTableExists()
        {
            //创建用户表
            //CheckTableExists<User>();
            //用下面的方式可以做些表创建后的初始化
            //InitializeTable<User>("insert into {0}([Name],[Pwd]) values 'Admin','888888')");
            User user= new User();
            user.ID=1500; //将使用分区表
            //根据实体类的表分区函数,动态检查和创建表
            CheckTableExists<User>(user);
            return true;
        }

        #endregion
    }

如上面的示例,在CheckAllTableExists 方法中使用实体类实例来检查和创建表,这样就可以实现动态创建表了。

关于如何动态查询表,可以参考《SOD框架“企业级”应用数据架构实战》一书的【6.9.6SOD 框架分库分表】。

 

posted on 2021-01-29 11:27  深蓝医生  阅读(568)  评论(4编辑  收藏  举报

导航