2009-09-10 14 views
0

使用NHibernate & INotifyPropertyChanged描述的方法保存錯誤,存儲庫將返回執行INotifyPropertyChanged代理的集合,但對某些對象保存或刪除時,它會引發錯誤:沒有留存用於:與INotifyPropertyChanged的攔截

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 ... 

我想,如果我創建沒有攔截器的會話SaveOrUpdate工作正常,但與攔截器它錯誤。

與攔截器:

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

沒有

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

我在爲如何去甚至弄清楚爲什麼攔截會破壞保存的損失。

我的代碼所做的唯一變化是改變線

類型類型= Type.GetType(clazz所);

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; 
} 

回答

0

解決方法是始終使用與攔截器的會話。我用攔截器創建了IList,但是使用通用會話保存。這繞過了將代理重定向到正確的持久存儲器的GetEntityName覆蓋。