我在我的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();
}
}
我的dto是
public class Dto
{
public int Id { get; set; }
public State State { get; set; }
}
GenericWellKnownInstanceType
来自here。如果我没有投射任何值,我的用户类型将按预期工作。我使用的是NHibernate 3.2。
我似乎解决了这个问题。
在GenericWellKnownInstanceType
的第73行(找到here)
替换
var value = (TId)rs.GetValue(index0);
与
var value = (TId)Convert.ChangeType(rs.GetValue(index0), typeof(TId));
我会看到发送补丁。