当DatabaseGenerated时自动增加一个数字.身份已经与实体框架一起使用

本文关键字:身份 实体 框架 一起 数字 一个 DatabaseGenerated 增加 | 更新日期: 2023-09-27 18:18:29

我们有一个使用Guids作为表键的情况。从技术上讲,我们选择的guid是基于它们的低碰撞几率,并且这个应用程序将在某一天被分发,在位置之间进行夜间数据同步(因此,需要低碰撞几率ID)

然而,业务需要一个人类可读的数字,可以在屏幕上、打印报告、标签上使用,并在对话中使用。我们用的是5位数,从10000开始。这些数字可以跨位置复制(位置A将有一个请求10000,位置B也会)。

我们的模型看起来像这样:

Public Class Request
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public int Number { get; set; }
}

那么在我们的save方法中,我们现在做的是这样的:

newRequestNumber = (_dbContext.Requests.Max(r => r.RequestNumber)) + 1;
request.Number = newRequestNumber
_dbContext.Requests.Add(request);
_dbContext.SaveChanges()

显然,这是非常幼稚的,我们现在遇到的问题是,这个数字是重复的。

据我所知,我们不能用DatabaseGeneratedOptions注释Number属性。身份,因为它已经被使用过一次。我也找不到任何我可以设置使用Fluent API将此字段标记为自动生成的数字。

我最初的想法是切换到某种乐观锁定策略。我们将为请求号添加一个唯一的约束,然后尝试将其保存在try/catch中。如果没有保存,再拿一次号码,冲洗并重复。这样做的问题是,如果请求由于除了唯一数字限制之外的其他原因而无法保存,我们将陷入循环。

我觉得我在这里错过了一个相当明显的解决方案,有什么想法吗?

当DatabaseGenerated时自动增加一个数字.身份已经与实体框架一起使用

可以创建一个表,其中一列用于保存整数键,另一列用于保存名称。您可以根据需要增加,您可以添加更多的行来表示不同类型的代理键。

我不会使用恒等式,因为那需要你插入很多很多行…