c# - 当 DatabaseGenerated.Identity 已经与 Entity Framework 一起使用时自动增加一个数字

标签 c# entity-framework identity optimistic-locking

在我们的表键中使用 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/

相关文章:

c# - 使用 Json.Net 时,无法从字符串正确反序列化异常

asp.net-mvc - 如何更新相关表?

c# - 访问嵌套 View 模型中的变量

sql - 导入 Microsoft Access 数据库时保留自动编号列的值

asp.net-core - DotNet Core Identity - 用户表与自定义表的关系

c# - MVVM 中的 WPF 数据网格多选完成事件。如何知道用户何时完成了他的选择?

c# - 路由参数在 WebApi 中不起作用

c# - 表达式树复制或转换

c# - 使用域驱动设计将根与 Entity Framework 聚合

sql-server - 请咨询: SQL Server Identity vs Unique Identifier keys when using Entity Framework