Проблема с Mapping / Casting Linq-to-Sql на разных типах - PullRequest
4 голосов
/ 03 мая 2010

Может быть, кто-то может помочь.

Я хочу иметь на карте Linq-Class другой тип данных.

Это работает:

 private System.Nullable<short> _deleted = 1;

 [Column(Storage = "_deleted", Name = "deleted", DbType = "SmallInt", CanBeNull = true)]
    public System.Nullable<short> deleted
    {
        get
        {
            return this._deleted;
        }
        set
        {
            this._deleted = value;
        }
    }

Конечно. Но нет, когда я хочу разместить некоторую логику для логического типа, например:

 private System.Nullable<short> _deleted = 1;

 [Column(Storage = "_deleted", Name = "deleted", DbType = "SmallInt", CanBeNull = true)]
    public bool deleted
    {
        get
        {
            if (this._deleted == 1)
            {
                return true;
            }
            return false;
        }
        set
        {
    if(value == true)

    {
                this._deleted = (short)1;
    }else
    {   
                this._deleted = (short)0;
    }
        }
    }

Я всегда получаю ошибку времени выполнения:

[TypeLoadException: GenericArguments[2], "System.Nullable`1[System.Int16]", on 'System.Data.Linq.Mapping.PropertyAccessor+Accessor`3[T,V,V2]' violates the constraint of type parameter 'V2'.]

Я не могу изменить базу данных на битовую. Мне нужно преобразовать класс отображения.

** Обновление

Согласно mmcteam, приведение в не нанесенном на карту методе делает свое дело. Не уверен, стоит ли так использовать OR OR, но это работает.

    private System.Nullable<short> _deleted = 1;

    public bool deleted
    {
        get
        {
            if (this._deleted == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        set
        {
            if (value)
            {
                this._deleted = 1;
            }
            else
            {
                this._deleted = 0;
            }
        }
    }


    [Column(Storage = "_deleted", Name = "deleted", DbType = "SmallInt", CanBeNull = true)]
    private short? deleted_smallint
    {
        get
        {
            return this._deleted;
        }
        set
        {
            this._deleted = value;
        }
    }

** УВЕДОМЛЕНИЕ / ПРОБЛЕМА

Вы не можете использовать не отображенные методы в запросах linq!

                 var result = from p in dc.Products
                               where p.enabled && !p.deleted 
                select p;

вызывает не поддерживаемое исключение sql. Без условия where данные получаются с правильными значениями.

Ответы [ 2 ]

4 голосов
/ 03 мая 2010

Или просто добавьте еще одно свойство в свой класс строк и приведите предыдущее к bool.

0 голосов
/ 03 мая 2010

Разве вы не хотите это:

[Column(Storage = "_deleted", Name = "deleted", DbType = "Bit", CanBeNull = false)] 
public bool deleted ...

Вместо этого:

[Column(Storage = "_deleted", Name = "deleted", DbType = "SmallInt", CanBeNull = true)] 
public bool deleted ...

...