SqlSugar能否反射数据库表动态生成类 返回
我的程序业务模型无法使用静态实体类操作数据库。因为需要给用户权限自定义业务模型,需要添加或删除列。
能否让SqlSugar根据用户定义的表自动生成相应的实体类,然后用特定方法匹配属性名称,给这个类赋值,再同步给数据库?
热忱回答(23)
-
fate sta VIP02024/2/2
这个是支持的
0 回复 -
fate sta VIP02024/2/2
https://www.donet5.com/Home/Doc?typeId=2562
0 回复 -
fate sta VIP02024/2/2
https://www.donet5.com/Home/Doc?typeId=1203
2个结合起来,一个读一个创建类
0 回复 -
fate sta VIP02024/2/2
C#类型可能要手动mapping一下
0 回复 -
fate sta VIP02024/2/2
有个技巧可以通查询 where 1=1 的datatable拿到c#类型
0 回复 -
咕噜噜 VIP02024/2/2
@fate sta:好的,多谢。我试一下
0 回复 -
咕噜噜 VIP02024/2/2
@fate sta:这句没看懂,你指的是获取列的数据类型吗?
0 回复 -
fate sta VIP02024/2/2
@咕噜噜:db.ado.getdatable("select * from table where 1=2") 这样可以获取C#类型
0 回复 -
咕噜噜 VIP02024/2/2
@fate sta:不好意思,原谅我愚钝。获取了datatable有什么用,将其转为类吗?网上查了一圈,将datatable转为list<T>类,好像跟我需求不大。我按照你说的第一种方法,已经创建了动态类,但在赋值时(
var value= db.DynamicBuilder().CreateObjectByType(type,new Dictionary<string, object>() { { "Id", "1" }, { "Name", "jack" } });
)报错:Invalid cast from 'System.String' to 'SqlSugar.DbColumnInfo'.
0 回复 -
fate sta VIP02024/2/2
Dt.Colulums能拿到每个列的类型
0 回复 -
fate sta VIP02024/2/2
Invalid cast from 'System.String' to 'SqlSugar.DbColumnInfo'. 明你的类型有问题
0 回复 -
fate sta VIP02024/2/2
C#Type应该是string
0 回复 -
咕噜噜 VIP02024/2/2
@fate sta:哦,我明白你的意思了。我用的columnInfo.GetType()获取的列类型,看来返回的是DbColumnInfo。还有一个属性DataType,不过返回的是string,也许也可以
0 回复 -
fate sta VIP02024/2/2
DataType 是设置数据库类型 ,对应你读的DataType ,column是拿C#类型
0 回复 -
咕噜噜 VIP02024/2/2
@fate sta:确实如您所说,使用datatable直接给出C#类型,不用再把数据库类型转换了。多谢,问题应该可以解决
0 回复 -
咕噜噜 VIP02024/2/4
@fate sta:类是产生了,感觉用起来很麻烦啊。属性不是直接暴露出来的,还得用反射获取,赋值也得用反射。还不能直接绑定wpf。如果界面数据修改了,还得用方法,找到对象,才能给到数据库。感觉像个黑匣子
0 回复 -
fate sta VIP02024/2/4
@咕噜噜:没听懂你说的东西,类是根据你表来的,缓存起来Type
0 回复 -
fate sta VIP02024/2/4
你的表改了就要以移除这个缓存
0 回复 -
fate sta VIP02024/2/4
另外还有缓存和清除缓存的方法
0 回复 -
咕噜噜 VIP02024/2/4
@fate sta:比如,我用"db.DynamicBuilder().CreateObjectByType()"创建了这个类的实例,并把datatable中的值赋值给了这个对象。把这个object组成一个集合,绑定到wpf的gridview.itemsource,视图是显示不了数据的,也无法在wpf中直接修改数据并返回给对象。还不如直接用datatable转成list的同时,绑定list到wpf,修改值的时候,生成新的dictionary,再用动态类对象插入或更新。也就是这个动态类实际上也就是便捷了数据库操作,不用拼凑sql语句了,但无法像普通类一样使用,无法被wpf控件直接绑定。
0 回复 -
fate sta VIP02024/2/4
ToDatatable() 可以这样查询的
0 回复 -
fate sta VIP02024/2/4
和创建这个Type没有关系
0 回复 -
fate sta VIP02024/2/4
db.QueryayableByObject(Type).ToDatatable()
0 回复