• 比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 "1000"; //分表
     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 框架分库分表】。

  • 相关阅读:
    vi/vim键盘图
    PostgreSQL学习----命令或问题小结
    PostgreSQL学习----模式schema
    OSM
    Spring基础(9) : 自动扫描
    Spring基础(8) : properties配置文件
    Spring基础(8) : 延迟加载,Bean的作用域,Bean生命周期
    Spring基础(7) : Bean的名字
    Spring基础(6) : 普通Bean对象中保存ApplicationContext
    Spring基础(5): 构造函数注入无法处理循环依赖
  • 原文地址:https://www.cnblogs.com/bluedoctor/p/14343999.html
Copyright © 2020-2023  润新知