2

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

 2 years ago
source link: https://www.cnblogs.com/bluedoctor/p/14343999.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

比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 框架分库分表】。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK