【问题标题】:Subsonic 3 - Object of type 'System.UInt64' cannot be converted to type 'System.Boolean'Subsonic 3 - “System.UInt64”类型的对象无法转换为“System.Boolean”类型
【发布时间】:2010-03-10 20:54:26
【问题描述】:

我正在使用 subsonic 3 尝试将 SQL2008 项目转换为 MySQL。

当项目尝试执行此 LINQ 查询时:

public IQueryable<Marca> SelecionaMarcas()
        {
            try
            {                

                return (from mc in _db.Marcas
                        where mc.Ativo == true
                        orderby mc.NomeMarca
                        select mc);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

返回此错误:

Object of type 'System.UInt64' cannot be converted to type 'System.Boolean'

在 SubSonic.Extensions Database.cs 第 193 行:

 if (val.GetType().IsAssignableFrom(valueType)){
                            currentProp.SetValue(item, val, null);
                        } else {
                            currentProp.SetValue(item, rdr.GetValue(i).ChangeTyp

那是我的数据库表:

CREATE TABLE `marca` (
  `ID_Marca` int(4) NOT NULL AUTO_INCREMENT,
  `NomeMarca` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '1',
  `Ativo` bit(1) NOT NULL,
  `LogoMarca` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`ID_Marca`)
) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

在调试模式下我发现错误是 Ativo 字段。

任何机构对此有任何想法?

非常感谢!

【问题讨论】:

    标签: c# asp.net-mvc subsonic subsonic3


    【解决方案1】:

    看起来mc.Ativo 被解读为UInt64 而不是bool。唉,我对 SubSonic 或者您如何调用它来告诉您需要更改哪些内容以使单位列映射到您希望的 bool 知之甚少。

    要修复症状,如果不是返回字段类型的根本问题,请更改

    where mc.Ativo == true
    

    where mc.Ativo != 0 
    

    会做你想做的。

    【讨论】:

    • 嗨,史蒂夫,感谢您的回复,但是“Ativo”是 Subsonic 生成的属性,它是 Bool 类型。所以代码不会像你说的那样让我输入一个 int 值。我认为我需要更改 Subsonic.Extension 中的条件。
    【解决方案2】:

    感谢所有帮助,但我在 SubSonic Core 中进行了修改以更正此错误,在 extensions.Database.cs 中,如果 ProportyType 的名称为“System.Boolean”,我会设置一个条件,否则我使用 GetBoolean 方法我使用 GetValue。有下面修改的代码:

                        //TO Adjust the BUG Boolean with UInt64.
                        Type valueType = null;
                        if (currentProp.PropertyType.FullName == "System.Boolean")
                            valueType = rdr.GetBoolean(i).GetType();
                        else
                            valueType = rdr.GetValue(i).GetType();
    

    (第 174 行)在 ValueType 条件之前

    我希望这对某人有所帮助! 谢谢

    【讨论】:

      【解决方案3】:

      我想我以前也遇到过这个问题,亚音速不喜欢设置了未分配标志的字段。通过在模板中找到 C# 和 DB 之间发生类型匹配的位置,可以很容易地修复它......

      【讨论】:

        猜你喜欢
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        • 2021-12-06
        相关资源
        最近更新 更多