マイコントローラー:重複エントリ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を「覚えている」と思いますか?
回答を受け入れてください! –