No Persister for: errore al salvataggio con INotifyPropertyChanged Interceptor
-
05-07-2019 - |
Domanda
Utilizzando il metodo descritto in NHibernate & amp; INotifyPropertyChanged , il repository restituirà una raccolta di proxy che implementano INotifyPropertyChanged, ma su alcuni oggetti durante il salvataggio o l'eliminazione genererà un errore:
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 ...
Ho capito che se creo la sessione senza l'intercettore, SaveOrUpdate funziona bene, ma con l'intercettore si sbaglia.
con l'intercettore:
public ISession GetSession(ISessionFactory factory)
{
IInterceptor dataBinding = new DataBindingInterceptor {SessionFactory = factory};
return factory.OpenSession(dataBinding);
}
senza
public ISession GetSession(ISessionFactory factory)
{
return factory.OpenSession();
}
Non riesco a capire come capire perché l'intercettore avrebbe interrotto il salvataggio.
L'unica modifica che ho apportato al codice è stata la modifica della riga
Type type = Type.GetType (clazz);
a
Digitare 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;
}
Soluzione
La soluzione era usare sempre la sessione con l'interceptor. Stavo creando l'IList con l'interceptor, ma risparmiando con una sessione generica. Ciò ha ignorato l'override GetEntityName che ha reindirizzato il proxy al persister corretto.