No Persister for: error on save with INotifyPropertyChanged Interceptor

眉间皱痕 提交于 2020-01-17 08:22:16

问题


Using the method described in NHibernate & INotifyPropertyChanged, the repository will return a collection of proxies that implement INotifyPropertyChanged, but on some objects when saving or deleting it will throw an error:

   at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
   at NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj)
   at NHibernate.Engine.ForeignKeys.IsTransient(String entityName, Object entity, Nullable`1 assumed, ISessionImplementor session)
   at NHibernate.Event.Default.AbstractSaveEventListener.GetEntityState(Object entity, String entityName, EntityEntry entry, ISessionImplementor source)
   at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
   at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
   at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event)
   at NHibernate.Impl.SessionImpl.SaveOrUpdate(Object obj)
   at MyCode ...

I figured out that if I create the session without the interceptor the SaveOrUpdate works fine, but with the interceptor it errors.

with the interceptor:

 public ISession GetSession(ISessionFactory factory)
        {
            IInterceptor dataBinding = new DataBindingInterceptor {SessionFactory = factory};
            return factory.OpenSession(dataBinding);
        }

without

 public ISession GetSession(ISessionFactory factory)
        {
            return factory.OpenSession();
        }

I'm at a loss for how to go about even figuring out why the interceptor would break the save.

The only change I made to the code was changing the line

Type type = Type.GetType(clazz);

to

Type type = FindType(clazz);

public Type FindType(string typeName)
{
    foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
    {
        Type foundType = assembly.GetType(typeName);

        if (foundType != null)
            return foundType;
    }
    return null;
}

回答1:


Solution was to always use the session with the interceptor. I was creating the IList with the interceptor, but saving with a generic session. This bypassed the GetEntityName override which redirected the proxy to the correct persister.



来源:https://stackoverflow.com/questions/1403176/no-persister-for-error-on-save-with-inotifypropertychanged-interceptor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!