Subsonic 3 - 'System.UInt64'类型的对象无法转换为'System.Boolean'类型

时间:2010-03-10 20:54:26

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

我正在使用亚音速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 Field。

任何人都对此有任何想法?

非常感谢!

3 个答案:

答案 0 :(得分:0)

看起来mc.Ativo被视为UInt64而不是bool。唉,我不太了解SubSonic或者你是如何调用它来告诉需要改变什么来使单位列映射到bool的。{/ p>

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

where mc.Ativo == true

where mc.Ativo != 0 

会做你想做的事。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

感谢所有帮助,但我在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 Conditional

之前

我希望这有助于某人! 感谢