Дозвуковой 3 - Объект типа «System.UInt64» не может быть преобразован в тип «System.Boolean» - PullRequest
1 голос
/ 10 марта 2010

Я использую дозвуковую 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'

в строке 193 SubSonic.Extensions Database.cs:

 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.

Есть ли у кого-нибудь идеи по этому поводу?

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 17 марта 2010

Я думаю, что я сталкивался с этой проблемой и раньше, дозвуковой не нравится поля, в которых установлен неназначенный флаг. Это можно легко исправить, найдя место в шаблоне, где происходит совпадение типов между C # и DB ...

0 голосов
/ 18 марта 2010

Спасибо за помощь, но я сделал модификацию в 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

Надеюсь, это кому-нибудь поможет! Спасибо

0 голосов
/ 11 марта 2010

Похоже, что mc.Ativo читается как UInt64, а не bool. Увы, я не знаю достаточно о SubSonic или о том, как вы вызываете его, чтобы указать, что необходимо изменить, чтобы преобразовать однобитный столбец в bool по вашему желанию.

Чтобы устранить симптом, если не основная проблема возвращаемого типа поля, измените

where mc.Ativo == true

до

where mc.Ativo != 0 

будет делать то, что вы хотите.

...