Проекция столбца, который использует пользовательский тип - PullRequest
1 голос
/ 13 февраля 2012

Я использую пользовательский тип пользователя для своего столбца State, но, к сожалению, если я проецирую этот столбец на dto, я получаю исключение, говорящее System.InvalidCastException : Specified cast is not valid..

Мой запрос

Item itemAlias = null;
Dto dtoAlias = null;

var l = Session.QueryOver(() => itemAlias)
    .SelectList(x => x
        .Select(xx => xx.Id).WithAlias(() => dtoAlias.Id)
        .Select(xx => xx.State).WithAlias(() => dtoAlias.State))
    .Where(x => x.State == States.FirstState)
    .TransformUsing(Transformers.AliasToBean<Dto>())
    .List<Dto>();

Мой код типа пользователя:

public class States : ReadOnlyCollection<State>
{
    public static State FirstState = new State(0, "First State");
    public static State SecondState = new State(1, "Second State");

    public States() 
        : base(new [] { FirstState, SecondState })
    {
    }

    public static IEnumerable<State> GetAll()
    {
        return new States();
    }
}

public class StateUserType : GenericWellKnownInstanceType<State, int>
{
    public StateUserType()
        : base(new States(), 
            (entity, id) => entity.Id == id, 
            entity => entity.Id)
    {
    }

    public override SqlType[] SqlTypes
    {
        get { return new[] { SqlTypeFactory.Int16 }; }
    }
}

Моя Item карта классов -

public class ItemMap : ClassMap<Item>
{
    public ItemMap()
    {
        Id(x => x.Id);

        Map(x => x.State)
            .CustomType<StateUserType>()
            .Not.Nullable();
    }
}

Мой код:

public class Dto
{
    public int Id { get; set; }
    public State State { get; set; }
}

GenericWellKnownInstanceTypeот здесь .Мой тип пользователя работает как положено, если я не проецирую какие-либо значения.Я использую NHibernate 3.2.

Решение

Кажется, я устранил проблему.

В строке 73 из GenericWellKnownInstanceType (найдено здесь )

замените

var value = (TId)rs.GetValue(index0);

на

var value = (TId)Convert.ChangeType(rs.GetValue(index0), typeof(TId));

Я посмотрю об отправке патча.

...