二次封装SqlSugar中的多态问题 返回

SqlSugar 老数据
4 3435

大家好,我是新手,有个问题想请教一下大神们:

我有很多个仪器(5+),每个仪器的参数基本上不相同,每一个仪器对应一个实体类。我封装的数据库类对这些实体类的操作方法基本相同。我现在的情况是每一个实体类都定义了一个DatabaseInstance去操作。下次我再添加一个新仪器,就又要定义一个对应的DatabaseInstance。我想用多态去解决多个DatabaseInstance的问题,但是发现在创建实体类对应的表结构,或者向数据库插入一个实体类实例时泛型中必须给出子类的类名。恳请各位大神指导一下!!!

相关代码如下:

 //所有仪器实体类的父类
 public  class InstrumentDataTable
 {
        public  static string GetClassName()
        {
            return System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;
            //return "InstrumentDataTable";
        }

}

//封装一个DatabaseManager,用于管理所有实体类的CRUD操作
class DatabaseContextManager: DatabaseContext<InstrumentDataTable>
    {




        /// <summary>
        /// 批量插入到指定数据库的指定表格
        /// </summary>
        /// <param name="data">List<InstrumentDataTable>:包含实体类对象的表名</param>
        /// <param name="databaseName">数据库名</param>
        /// <param name="tbName">表名</param>
        public void Insert(List<InstrumentDataTable> data, string databaseName, string tbName)
        {
            /*foreach(InstrumentDataTable item in data)
             {
                 Insert(item);
             }*/
            //或者
            SqlSugarClient tmpDB = DatabaseHelper.GetDatabaseInstance(databaseName);
            if (!DatabaseHelper.IsTableExists(tbName))
            {
                DatabaseHelper.CreateTable(InstrumentDataTable.GetClassName(), typeof(InstrumentDataTable), tbName, tmpDB);
            }
            tmpDB.Insertable<InstrumentDataTable>(data.ToArray()).AS(tbName).ExecuteCommand();

        }

        /// <summary>
        /// 批量插入到指定数据库对象的当前表
        /// </summary>
        /// <param name="data">List<InstrumentDataTable>:包含实体类对象的表名</param>
        /// <param name="dataBase">SqlSugarClient:数据库对象</param>
        public void Insert(List<InstrumentDataTable> data, SqlSugarClient dataBase)
        {
            dataBase.Insertable<InstrumentDataTable>(data.ToArray()).ExecuteCommand();
        }


        /// <summary>
        /// 创建表
        /// </summary>
        /// <param name="tb_name">表名</param>

        public void CreateTable(string tb_name)
        {
            InitKeyType attr = db_work.CurrentConnectionConfig.InitKeyType;
            db_work.CurrentConnectionConfig.InitKeyType = InitKeyType.Attribute;//创建表必须指定这个属性
            db_work.MappingTables.Add(InstrumentDataTable.GetClassName(), tb_name); //全局映射表名

            db_work.CodeFirst.InitTables(typeof(InstrumentDataTable));
            db_work.CurrentConnectionConfig.InitKeyType = attr;

            MainWindow.CurrentTables.Add(InstrumentStatus.NetworkAnalysis, tb_name);
        }

        /// <summary>
        /// 在指定数据库下创建表
        /// </summary>
        /// <param name="tb_name">表名</param>
        /// <param name="dataBase">指定数据库的连接对象</param>
        public void CreateTable(string tb_name, SqlSugarClient dataBase)
        {
            InitKeyType attr = dataBase.CurrentConnectionConfig.InitKeyType;
            dataBase.CurrentConnectionConfig.InitKeyType = InitKeyType.Attribute;//创建表必须指定这个属性
            dataBase.MappingTables.Add(InstrumentDataTable.GetClassName(), tb_name);

            dataBase.CodeFirst.InitTables(typeof(InstrumentDataTable));

            dataBase.CurrentConnectionConfig.InitKeyType = attr;
            //MainWindow.CurrentTables.Add(InstrumentStatus.NetworkAnalysis, tb_name);
        }



        
    }


热忱回答4

  • 用泛型怎么样?

    0 回复
  • @Merely。____:目前只能用泛型了,但是我用泛型时,创建表出现异常:

    exception.png

    0 回复
  • 🍎 🍎 VIP0
    2023/4/7

    Db.InsertableByObject(pageList).ExecuteCommand();

    0 回复
  • 少了泛型约束吧   Where T:class,new()

    0 回复