Правильный способ вычисления порядка с помощью entity framework / sql

#c# #sql #asp.net-core #entity-framework-core

#c# #sql #asp.net-core #entity-framework-core

Вопрос:

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

Вот мой код

 using (var tran = context.Database.BeginTransaction(IsolationLevel.Serializable))
{
    try
    {
        var lastDocument = context.Documents.OrderByDescending(x => x.Id).FirstOrDefault();
        int order = 1;
        if (lastDocument != null)
        {
            order = lastDocument.Order   1;
        }
        var document = new Document
        {
            CreatedDate = DateTimeOffset.UtcNow,
            Name = Guid.NewGuid().ToString(),
            Order = order
        };
        context.Documents.Add(document);
        context.SaveChanges();
        tran.Commit();
    }
    catch (Exception ex)
    {
        tran.Rollback();
    }
}
  

Комментарии:

1. Is this a good way to set the transaction level to serializable? Работает ли это?

2. order = lastDocument.Order 1; Это кричит «ужасная идея». Почему вы не используете IDENTITY столбец?

3. @mjwills 1. Работает, но медленно 2. Поскольку пользователь может изменять порядок в приложении spa, это что-то вроде перетаскивания

4. Почему пользователю важно, какой номер заказа? Его должна генерировать база данных, а не приложение.

5. 1.Works but slowly Для меня звучит как сериализуемый. 🙂