2017-10-10 26 views
1

マイコントローラー:重複エントリNHibernateはオーロラのキー 'PRIMARY' の 'XXX'(MySQLの)

using (ISession session = NHibernateSessionPerRequest.GetCurrentSession()) 
{ 
    using (ITransaction transaction = session.BeginTransaction()) 
    { 
     try 
     { 
      // Changed for the sake of simplicity. 
      // What I meant was entities being saved without using Flush() 

      var asset = new Asset() { name = "test" }; 
      session.Save(asset); 

      var story = new Story(); 
      session.Save(story); 

      asset.stories.Add(story); 
      session.Save(asset); 

      var color = new Color() { name = colorName }; 
      color.asset = asset; 
      session.Save(color); 

      transaction.Commit(); 

      return Json(new { Status = "OK" }); 
     } 
     catch (Exception ex) 
     { 
      if (!transaction.WasCommitted) 
      { 
       transaction.Rollback(); 
      } 

      return Json(new { Status = "NOK", Mensagem = ex.Message, }); 
     } 
    } 
} 

マイマッピング:

public AssetMap() 
{ 
    Id(x => x.id).GeneratedBy.Increment(); 
    Map(x => x.name); 
    HasMany(x => x.stories); 
} 

public StoryMap() 
{ 
    Id(x => x.id).GeneratedBy.Increment(); 
} 

public ColorMap() 
{ 
    Id(x => x.id).GeneratedBy.Increment(); 
    Map(x => x.name); 
    References(x => x.asset); 
} 

すべてのidカラムは自動インクリメントされています。

すべてが細かいようだが、EVERYは、たまには私はこのエラーを取得する:

Duplicate entry 'XXX' for key 'PRIMARY' transaction could not insert: [K1.Domain.Story#XXX][SQL: INSERT INTO Story (id) VALUES (?)]

OR

Duplicate entry 'YYY' for key 'PRIMARY' transaction could not insert: [K1.Domain.Color#YYY][SQL: INSERT INTO Color (name, asset_id, id) VALUES (?, ?, ?)]

エラーがちょうど物語で、資産(最初の実体が保存された)で発生したことがありませんか、カラーエンティティ。

エラーメッセージは、データベースにid = XXX(または、id = YYYの色)のストーリーが存在し、他のユーザーによって数秒前に追加されているため、絶対に正しいです。

背景情報:

  • は、同時実行の問題だ私には思えます。 私はISessionがスレッドセーフではないことを知っていますが、MySQLやHibernateはそれをどう扱うか分かりません。だから、私は何か間違っていると確信しています。

  • 私はエラーが断続的に発生すると思います。なぜなら、MySQL/NHibernateが同じIDを持つ別のStoryまたはColorが常にあるとは限りませんからです。

  • SQL Serverから移行しており、コードは正常に動作していました。 私たちは最後の3日間を成功することなくこれに掘り下げました。

  • 私はIDを設定していません。 私はそれが意味を成しているのか分かりません...しかし、私はNHibernateがColor/StoryにIDを与えていると思っていますが、私がトランザクションをコミットするとき、IDはもはや利用できません。役立つかもしれない

もう一つ...私の最後のテスト中

は、NHibernateのは、.NETが例外を発射した後、ID(既に存在する)= 320962として物語を保存しようとしました。

その後、もう一度[保存]ボタンをクリックし、NHibernateはID = 320963(320962 + 1)のストーリーを保存しようとしました。

次に、3回目の保存ボタンをクリックし、NHibernateがID = 320964(320962 + 2)のストーリーを保存しようとしました。

これらの3つのIDはすべて利用できなかったため、その後は機能しませんでした。 NHibernateはこれらのIDを「覚えている」と思いますか?

答えて

0

私はちょうどに私のマッピングを変更するために必要な:MySQLは、SQL Serverはない別の方法で自動インクリメント列を扱うようだ

Id(x => x.id).GeneratedBy.Identity(); 

+0

回答を受け入れてください! –

関連する問題