shuxinqin / Chloe

A lightweight and high-performance Object/Relational Mapping(ORM) library for .NET --C#
https://github.com/shuxinqin/Chloe/wiki
MIT License
1.52k stars 455 forks source link

BUG 原生SQL查询,返回对象映射没有忽略掉[NotMapped]的属性 #375

Closed Sheldon-NULL closed 11 months ago

Sheldon-NULL commented 11 months ago

版本: image

问题代码: list = context.SqlQuery(listSql.ToString());

会把有[NotMapped]特性的属性也尝试赋值填上去,然后由于那个属性不是可为空的,就报错了。

Sheldon-NULL commented 11 months ago

Chloe.Exceptions.ChloeException:“Please make sure that the member of the column 'MaxCount'(13,INT,System.Int32) map is nullable.” SqlNullValueException: Data is Null. This method or property cannot be called on Null values.

shuxinqin commented 11 months ago

嗯,是的,目前SqlQuery的逻辑是只要数据库返回的字段有和csharp类属性对上的都会尝试赋值。 之所以这样设计,是因为sql是开发人员自主可控的(不需要的字段查询不要将对应的字段放在select里),所以就忽略[NotMapped]特性。

Sheldon-NULL commented 11 months ago

不,问题不是这样的,或者说你解释的理由说不通的。这是一个BUG。[NotMapped]特性的字段,怎么会在SQL中返回呢?数据库里面根本没有这个字段。

shuxinqin commented 11 months ago

将sql和类贴来看看。

Sheldon-NULL commented 11 months ago

SQL: DROP TEMPORARY TABLE IF EXISTS tempTable;CREATE TEMPORARY TABLE IF NOT EXISTS tempTable AS SELECT FROM substation.volunteer_act act WHERE act.RegiEndTime > '2023-11-25 17:23:53' AND act.RegiStartTime <= '2023-11-25 17:23:53' ORDER BY act.SortId DESC,act.Id DESC;INSERT INTO tempTable SELECT FROM substation.volunteer_act act WHERE act.RegiStartTime > '2023-11-25 17:23:53'ORDER BY act.SortId DESC,act.Id DESC;INSERT INTO tempTable SELECT FROM substation.volunteer_act act WHERE act.RegiEndTime < '2023-11-25 17:23:53'ORDER BY act.SortId DESC,act.Id DESC;SELECT FROM tempTable where Status > 0 and AuditStatus =3 limit 0,10 ;DROP TEMPORARY TABLE IF EXISTS tempTable;

类在附件 新建文本文档.txt

Sheldon-NULL commented 11 months ago

一开始我以为是SELECT *的问题,后面写了一个用.NET 6的Demo尝试去用简单User表去复现问题的,但遗憾没有复现出来。(发现这个BUG的环境.NET CORE2.2 MySQL8.026)

shuxinqin commented 11 months ago

看不出什么原因~·我这也没重现。- -

Sheldon-NULL commented 11 months ago

有没有把我这个类的?删掉再试的,这里面是我加了?让他可空才跑过去的

shuxinqin commented 11 months ago

不知道你的表结构是啥样~ 你确定sql语句返回的datareader里没包含 MaxCount吗?出现这个异常,很大可能是查询返回的DataReader里有maxcount这个字段。

Sheldon-NULL commented 11 months ago

好吧,我刚刚去翻了一下表结构,确实是有这个字段的~ 这个问题是个误会! 不得不吐槽一句,至今也没想明白,上一任的开发,为啥表里面有的字段,要给NotMapper,而且需要的时候,也是实时通过另外的表查出来再计算的,非常的不理解。