Повторяющаяся запись "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.