【问题标题】:Unique serial number generation - Entity Framework ASp.net MVC唯一序列号生成 - Entity Framework ASp.net MVC
【发布时间】:2020-08-05 06:53:03
【问题描述】:

我正在开发一个投诉管理,我必须为每个投诉生成唯一的序列号,例如 00001/20 {序列号/年}。

我正在使用存储库模式,并且我正在使用以下代码 sn-p 生成此投诉编号,但问题是如果两个用户尝试同时提出投诉,它将生成相同的投诉编号并引发错误我将序列号保存在单独的表中,下面也提到了该表以供参考。让我知道实现这一目标的最佳方法

 int serialNo = repository.serialNo.Find(c => c.Year == DateTime.Now.Year).FirstOrDefault().TicketCounter;
string complaintNo = string.Format("{0}", serialNo.ToString().PadLeft(5, '0'));

model.Id = repository.complaintRepo.GetMaxPK(c => c.Id);

我正在使用存储库模式。

【问题讨论】:

  • 这会有帮助吗? *.com/questions/36868254/…
  • 是的,但正如你所见,我有两列 ID 和投诉不,我想要唯一的,我可以使其自动生成,但投诉不是问题所在。这就是我手动获取最大值并递增的原因。
  • 嗯,没错,但关键是模型 id 应该在数据库级别生成(或保留) - 然后它将保持唯一。我认为您在这里有几个解决方案,例如:默认情况下更改表以生成自定义ID,例如:dba.stackexchange.com/questions/222617/…(那么您根本不需要上面的代码,它将在创建新记录时由数据库完成)。或者,使用现有代码,但当您将其添加到数据库时出错时,再次分配下一个 # 并尝试再次保存。 SN 在所有年份中都是唯一的吗?
  • 序列号将逐年变化,因此您建议如何生成投诉编号。我会在数据库级别生成,但是投诉没有呢??
  • 如果您使用 sql server,您可以设置您的表,以便它生成一个序列,当您插入新的表中的行。

标签: asp.net entity-framework model-view-controller


【解决方案1】:

我想,其中一种解决方案是设置表格,以便在每个新行上自动生成所需的 ID。这可确保 ID 始终是唯一的。

CREATE SEQUENCE MySequence
AS int
START WITH 1
INCREMENT BY 1;

CREATE TABLE Complaint
(
    Id    char(8) CONSTRAINT [DF_Complaint_ID]
                  DEFAULT FORMAT((NEXT VALUE FOR MySequence), '0000#')
                  +'/'+RIGHT(YEAR(GETDATE()),2),
    Foo   int,
    Bar   int,

    CONSTRAINT [PK_MyTable] PRIMARY KEY (Id)
);

演示:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=18a5d0fec80a3985e30cef687d3c8e49

因此无需手动分配 id,您的代码可能看起来像

var c = repository.Insert(new model
{
   Foo = ...
   Bar = ...,
   ...
});
repository.Save();

// you can get id after inserting data in the database
string id = c.Id;

【讨论】:

  • 谢谢,这真的对我有很大帮助,只是我的序列基于年份的一个混乱,所以每年的序列都会从一个开始。另一个问题是,如果我有主详细信息,我想将主键引用到详细信息表,然后在设置所有值之后,我想访问数据库进行插入。
  • 如果主键在数据库中尚不存在并且可以(正如您已经体验过的那样)同时对并发用户相同,那么将主键引用到详细表有什么意义?
  • 原因是为了避免任何差异,如果我只是插入记录主表数据,然后获取标识值以将其分配到外部表中,如果保存失败并引发错误怎么办。这就是为什么我目前正在做的是手动生成主键并将其分配到外部表中,并在设置所有值后调用 SaveChanges() 方法。
  • 这种方法无助于避免“差异”,同时每个并发用户都可以获得相同的 id。修复它的最简单方法是将 id 保存在数据库中,这样您就可以随时知道 id 是否已被使用,或者在将数据插入数据库时​​分配它。
  • 那么您建议先保存主表数据并获取id并保存明细表数据?