Я обновлял установку NHibernate (все еще был на 1.2!). Все было хорошо, пока я не попытался установить перехватчик. Если я добавляю Перехватчик к вызову OpenSession (), я получаю эту ошибку при попытке загрузить сущность из БД:
"Invalid Cast (проверьте соответствие на предмет несоответствия типов свойств); установщик System.Object"
Если перехватчик отсутствует, эта ошибка не возникает.
Перехватчик очень прост, и на самом деле я закомментировал все, чтобы протестировать:
public class Interceptor : EmptyInterceptor
{
public override void AfterTransactionBegin(ITransaction tx)
{
}
public override void AfterTransactionCompletion(ITransaction tx)
{
}
public override void BeforeTransactionCompletion(ITransaction tx)
{
}
//public override int[] FindDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, IType[] types)
//{
//}
//public override object GetEntity(string entityName, object id)
//{
//}
//public override string GetEntityName(object entity)
//{
//}
public override object Instantiate(string entityName, EntityMode entityMode, object id)
{
//((EntityBase)entity).Instantiate(entityName, entityMode, id)
return new object();
}
//public override bool? IsTransient(object entity)
//{
//}
public override void OnCollectionRecreate(object collection, object key)
{
}
public override void OnCollectionRemove(object collection, object key)
{
}
public override void OnCollectionUpdate(object collection, object key)
{
}
public override void OnDelete(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
//((EntityBase)entity).OnDelete(entity, id, state, propertyNames, types);
}
//public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, IType[] types)
//{
//}
public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
//if (entity.GetType().FullName.Equals("EntityBase"))
// return ((EntityBase)entity).OnLoad(entity, id, state, propertyNames, types);
//else
return false;
}
//public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
//{
//}
public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
//return ((EntityBase)entity).OnSave(entity, id, state, propertyNames, types);
return true;
}
public override void PostFlush(System.Collections.ICollection entities)
{
}
public override void PreFlush(System.Collections.ICollection entities)
{
}
public override void SetSession(ISession session)
{
}
}
Таким образом, я совершенно сбит с толку. Как я уже сказал, с Interceptor он выдает ошибки при загрузке и гидратации объектов (после срабатывания события OnLoad), без Interceptor все нормально. Я использую nHibernate 3.2.0.2001 с .Net4 против SQL Server 2008.
Любая помощь приветствуется! Ben
К сожалению, я не смог решить эту проблему, мне пришлось переключиться на Linq-SQL из-за этой конкретной проблемы, и я не смог найти решение в сроки, необходимые для использования этих шаблонов. Поэтому я не могу предоставить больше информации в настоящее время.