Повторяющаяся запись "XXX" для ключа "PRIMARY" в 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);
}

Все столбцы идентификаторов имеют автоматическое увеличение.

Все вроде бы хорошо, но КАЖДЫЙ РАЗ ТОЛЬКО Я получаю эту ошибку:

Не удалось вставить повторяющуюся запись "XXX" для ключевой транзакции "PRIMARY": [K1.Domain.Story # XXX] [SQL: INSERT INTO Story (id) ЗНАЧЕНИЯ (?)]

ИЛИ ЖЕ

Не удалось вставить повторяющуюся запись 'YYY' для ключевой транзакции 'PRIMARY': [K1.Domain.Color # YYY] [SQL: INSERT INTO Color (name, asset_id, id) VALUES (?,?,?)]

Ошибка никогда не происходит с Активом (первый сохраненный объект), только с объектами Story или Color.

Сообщение об ошибке абсолютно корректно, поскольку в базе данных существует история с id = XXX (или Color с id = YYY), добавленная другим пользователем за несколько секунд до меня.

Справочная информация:

  • Мне кажется, это проблема параллелизма. Я знаю, что ISession не является поточно-ориентированным, но выглядит неубедительным MySQL или NHibernate не знает, как с этим обращаться. Итак, я уверен, что делаю что-то не так.

  • Я думаю, что ошибка происходит периодически только потому, что не всегда будет другая История или Цвет с тем же идентификатором, который MySQL/NHibernate пытается использовать.

  • Мы мигрировали с SQL Server, и наш код работал отлично. Мы провели последние 3 дня, копаясь в этом без успеха.

  • Я не устанавливаю какой-либо идентификатор. Я не знаю, имеет ли это смысл... Но я думаю, что NHibernate дает Color/Story идентификатор (с доступен в данный момент), но когда я фиксирую транзакцию, идентификатор больше не доступен.

Еще одна вещь, которая может помочь...

Во время моего последнего теста NHibernate пытался сохранить Story с ID = 320962 (который уже существует), а затем.NET вызвал исключение.

Затем я снова нажал кнопку "Сохранить", и NHibernate попытался сохранить историю с ID = 320963 (320962 + 1).

Затем я в третий раз нажал кнопку "Сохранить", и NHibernate попытался сохранить историю с ID = 320964 (320962 + 2).

Ни один из них тогда не работал, так как все эти 3 идентификатора не были доступны. Предполагалось ли NHibernate "запомнить" эти идентификаторы?

1 ответ

Решение

Мне просто нужно было изменить мои отображения на:

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

Похоже, что MySQL обрабатывает столбцы с автоинкрементом по-другому, чем SQL Server.

Другие вопросы по тегам