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;
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top