gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:52:23 25 4
gpt4 key购买 nike

我的 Controller :

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 (?, ?, ?)]

错误永远不会发生在 Assets (保存的第一个实体)上,只会发生在故事或颜色实体上。

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

背景信息:

  • 在我看来这是一个并发问题。我知道 ISession 不是线程安全的,但它看起来很蹩脚,MySQL 或 NHibernate 不知道如何处理它。所以,我很确定我做错了什么。

  • 我认为错误会间歇性发生,因为并非总是会有另一个 MySQL/NHibernate 尝试使用具有相同 ID 的 Story 或 Color。

  • 我们从 SQL Server 迁移过来,我们的代码运行得非常好。在过去的 3 天里,我们一直在深入研究这个问题,但没有成功。

  • 我没有设置任何 ID。我不知道这是否有意义...但我认为 NHibernate 为 Color/Story 提供了一个 ID(目前可用),但是,当我提交事务时,该 ID 不再可用。

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

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

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

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

然后都没有用,因为所有这 3 个 ID 都不可用。NHibernate 应该“记住”这些 ID 吗?

最佳答案

我只需要将映射更改为:

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

看来 MySQL 处理自动递增列的方式与 SQL Server 不同。

关于c# - NHibernate Aurora (MySQL) 中键 'XXX' 的重复条目 'PRIMARY',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46675476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com