在我们的表键中使用 Guid 的情况。从技术上讲,我们选择 GUID 是因为它们碰撞几率低,而且这个应用程序有一天会被分发,每晚在不同地点之间进行数据同步(因此,需要低碰撞几率 ID)
但是,企业需要一个人类可读的数字,可以在屏幕上、打印报告、标签和对话中使用。为此,我们使用从 10000 开始的 5 位数字。这些数字可以在不同位置重复(位置 A 将有一个请求 10000,位置 B 也有)。
我们的模型看起来像这样:
Public Class Request
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public int Number { get; set; }
}
然后在我们的保存方法中,我们目前正在做这样的事情:
newRequestNumber = (_dbContext.Requests.Max(r => r.RequestNumber)) + 1;
request.Number = newRequestNumber
_dbContext.Requests.Add(request);
_dbContext.SaveChanges()
显然这是非常天真的,我们现在遇到了重复该数字的问题。
据我所知,我们无法使用 DatabaseGeneratedOptions.Idnetity 注释 Number 属性,因为它已经被使用过一次。我也找不到任何可以使用 Fluent API 设置的内容来将此字段标记为自动生成的数字。
我最初的想法是改用某种乐观锁定策略。我们会对请求编号添加唯一约束,然后尝试将其保存在 try/catch 中。如果没有保存,请再次获取号码,冲洗并重复。这样做的问题是,如果请求由于唯一编号限制以外的其他原因而无法保存,我们将陷入循环。
我觉得我在这里缺少一个相当明显的解决方案,有什么想法吗?
最佳答案
您可以创建一个表,其中一列用于保存整数键,另一列用于名称。您可以根据需要增加,您可以添加更多行来表示不同类型的代理键。
我不会使用标识,因为这需要您插入很多行...只需更新给定行的列即可。
关于c# - 当 DatabaseGenerated.Identity 已经与 Entity Framework 一起使用时自动增加一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25373491/