二次封装SqlSugar中的多态问题 返回
SqlSugar
老数据
4
3435
悬赏:5 飞吻
大家好,我是新手,有个问题想请教一下大神们:
我有很多个仪器(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)
-
Merely。____ VIP0
2019/2/22用泛型怎么样?
0 回复 -
hanshanton VIP0
2019/2/25@Merely。____:目前只能用泛型了,但是我用泛型时,创建表出现异常:
0 回复 -
🍎 VIP0
2023/4/7Db.InsertableByObject(pageList).ExecuteCommand();
0 回复 -
fate sta VIP0
2023/4/7少了泛型约束吧 Where T:class,new()
0 回复