Генерация уникального серийного номера - Entity Framework ASp. net MVC - PullRequest
0 голосов
/ 22 апреля 2020

Я разрабатываю систему управления жалобами, в которой мне нужно генерировать уникальный серийный номер для каждой жалобы, например 00001/20 {Серийный номер / год}.

Я использую шаблон хранилища и генерирую этот номер жалобы. используя следующий фрагмент кода, но проблема заключается в том, что если два пользователя попытаются подать жалобу одновременно, он сгенерирует одну и ту же жалобу "нет", и это привело к ошибке, поскольку я храню серийный номер в отдельной таблице, которая также упоминается ниже для справки , Дайте мне знать лучший способ достичь этого

 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);

Я использую шаблон хранилища.

1 Ответ

0 голосов
/ 22 апреля 2020

Полагаю, одним из решений является настройка таблицы таким образом, чтобы она автоматически генерировала требуемый идентификатор в каждой новой строке. Это гарантирует, что идентификатор всегда уникален.

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

Таким образом, не нужно будет назначать идентификатор вручную, и ваш код может похожи

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

// you can get id after inserting data in the database
string id = c.Id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...