NHibernate Aurora (MySQL) 中键 'PRIMARY' 的重复条目 'XXX'

Duplicate entry 'XXX' for key 'PRIMARY' in NHibernate Aurora (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 列都是自动递增的。

一切似乎都很好,但我偶尔会收到此错误:

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

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

Asset(保存的第一个实体)永远不会发生错误,只是 Story 或 Color 实体。

错误消息是绝对正确的,因为它在数据库中确实存在一个 ID = XXX(或颜色 ID = YYY)的故事,由另一个用户在我之前几秒添加。

背景资料:

还有一件事可能会有所帮助...

在我上次测试期间,NHibernate 试图保存 ID = 320962 的 Story(它已经存在),然后 .NET 触发了异常。

然后我再次单击“保存”按钮,NHibernate 尝试保存 ID = 320963 (320962 + 1) 的 Story。

然后,我第三次单击“保存”按钮,NHibernate 尝试保存 ID = 320964 (320962 + 2) 的 Story。

None 然后工作,因为所有这 3 个 ID 都不可用。 NHibernate 是否应该 "remember" 这些 id?

我只需要将映射更改为:

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

似乎 MySQL 以不同的方式处理自动递增列 SQL 服务器。