2012-02-09 8 views
2

私はデータベースにアクセスするためにc#とnhibernateを使っています。 私は同じアクションを実現できる、編集する、または同じDBからエンティティを取り除くことができる2つまたは3つの端末を持っています。 私の問題は、私の端末が、別の端末がデータベースを変更したかどうかを認識していないことです。 キャッシュが原因だと思います。 私はFlush()とEvict()コマンドを結果なしで試しました。 は、私は私のひどい英語NHibernate古いデータを持ち込む

-----情報を追加しました-------

それは、C#のデスクトップアプリケーションのため申し訳ありませんが、誰かが私を助けることができることを望みます。 私はエラーが表示されません、問題は私が編集または削除するとき、エンティティが別の端末から変更されたかどうかを知る必要があるということです。私がデータベースからエンティティを持ってきたら、アプリケーションを再起動するまで、別の端末からの変更が表示されません。

セッションは、次のコードによって作成されます。これは

[PossibleLongOperation] 
     private void DoConnectionWork(string nhibernateConfigPath) 
     { 
      String appPath = Directory.GetParent(Assembly.GetAssembly(GetType()).Location).FullName; 
      String serializablefilePath = Path.Combine(appPath, "configuration.serialized"); 
      try 
      { 
       if (IsConfigurationFileValid(serializablefilePath)) 
       { 
        Configuration = LoadConfigurationFromFile(serializablefilePath); 
       } 
       else 
       { 
        // configuration is immutable, store last returned value 
        Configuration = new Configuration(); 
        Configuration.Configure(nhibernateConfigPath); 
        Configuration.AddAssembly(typeof(ObjectEntity).Assembly); 
        SaveConfigurationToFile(serializablefilePath, Configuration); 
        new SchemaUpdate(Configuration).Execute(true, true); 
        Console.WriteLine(@"Se solicitó la actualización de datos"); 
       } 
       //NHibernateSchemaExport(); 
      } 
      catch (Exception ex) 
      { 
       //if(File.Exists(serializablefilePath)) 
       // File.Delete(serializablefilePath); 
       throw new GenericRepositoryException(string.Format("Error while configuring NHibernate: {0}.", ex.Message), ex); 
      } 

      try 
      { 
       SessionFactory = Configuration.BuildSessionFactory(); 
      } 
      catch (Exception ex) 
      { 
       //if (File.Exists(serializablefilePath)) 
       // File.Delete(serializablefilePath); 
       throw new GenericRepositoryException(string.Format("Error while building NH session factory: {0}.", ex.Message), ex); 
      } 
     } 

----------追加-------------

私は(クリア後に入手例外)セッション

09-02-2012 13:22:54|Error|Error: 
NHibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 394, of entity: Model.Pedido 
    en NHibernate.Engine.StatefulPersistenceContext.CheckUniqueness(EntityKey key, Object obj) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\StatefulPersistenceContext.cs:línea 688 
    en NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformUpdate(SaveOrUpdateEvent event, Object entity, IEntityPersister persister) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:línea 227 
    en NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsDetached(SaveOrUpdateEvent event) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:línea 186 
    en NHibernate.Event.Default.DefaultUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultUpdateEventListener.cs:línea 29 
    en NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:línea 53 
    en NHibernate.Impl.SessionImpl.FireUpdate(SaveOrUpdateEvent event) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:línea 2666 
    en NHibernate.Impl.SessionImpl.Update(Object obj) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:línea 524 
    en Besnik.GenericRepository.NHibernate.NHibernateUnitOfWork.Update[TEntity](TEntity entity) 
    en Besnik.GenericRepository.GenericRepository`2.Update(TEntity entity) 
    en Services.Services.Implementation.PedidoServiceImpl.<>c__DisplayClass8.<Anular>b__7() en C:\Repositorio\ProyectosCasinoClub\SPMontaPlatosOK\Code\Services\Services\Implementation\PedidoServiceImpl.cs:línea 72 
    en Services.Transaction.Transaction.Execute(Action transactionalAction, Action`1 onException) en C:\Repositorio\ProyectosCasinoClub\SPMontaPlatosOK\Code\Services\Transaction\Transaction.cs:línea 32 
+1

これはウェブアプリケーション、デスクトップアプリケーションですか?セッションコンテキストはどのように作成されていますか? NHibernateのバージョン管理を使用していますか?もしあればどのようなエラーが表示されていますか? 'StaleStateException'?私たちはあなたにこの情報に明確な答えを与えるために、より多くの情報を必要としていると思います。 –

+0

私は必要な情報を追加しました。ありがとう –

+0

あなたのセッションファクトリが設定からどのように構築されているのですか?あなたのセッションはどうですか?フォームごとのセッション、スレッドごとのセッションなどを使用していますか? –

答えて

2

あなたは)(session.Clearによって、L1セッションのキャッシュをクリアしてみましたか?

+0

はい、試してみましたが、データを更新するために働いていましたが、セッションがクラッシュして、他の操作でエラーが発生しました –

+0

あなたのセッションは、あなたはプレゼンター/フォームまたは何かごとにセッションをしています。セッションではどのようなエラーが出ますか? –

+0

私は例外を追加しました。 –

関連する問題