1

У меня есть две таблицы:Entity Framework для Auto Increment Non Удостоверение Column/параллелизмом Выпуск

CREATE TABLE [dbo].[Customers] (
    [CustomerId] INT   IDENTITY (1, 1) NOT NULL, 
    CONSTRAINT [PK_dbo.Customers] PRIMARY KEY CLUSTERED ([CustomerId] ASC) 
); 

CREATE TABLE [dbo].[Campaigns] (
    [Id]   INT   IDENTITY (1, 1) NOT NULL, 
    [CustomerId] INT   NULL, 
    [CampaignId] INT   NULL, 
    CONSTRAINT [PK_dbo.Campaigns] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

Campaigns.CampaignId является уникальным для каждого CustomerId; поэтому он не может быть тождественным. Поэтому из моего веб-приложения мне нужно автоматически увеличивать кампанию CampaignId при создании кампании. Раньше мне приходилось получать блокировку в одной транзакции, чтобы получить следующий максимум и выпустить вставку. Как я мог бы выполнить одно и то же в EF, не беспокоясь о том, чтобы эффективно управлять параллелизмом?

В контроллере кампании, у меня есть это (UserContext статический вспомогательный класс, который извлекает текущий CUSTOMERID пользователя и дб мой DbContext):

public ActionResult Create(Campaign campaign) 
{ 
    if (ModelState.IsValid) 
    { 
     int customerId = UserContext.customerId; 
     int maxCampaignId = db.Campaigns.Where(c => c.CustomerId == customerId).Max(c => c.CampaignId); 
     campaign.CampaignId = maxCampaignId + 1; 
     db.Campaigns.Add(campaign); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(campaign); 
} 

Но разве это не риск повторяющихся значений в CustomerId в высокая среда параллелизма?

EDIT:

Я забыл упомянуть, что справ не вариант. Идентификаторы должны быть целыми числами.

EDIT 2:

Я забыл упомянуть, что есть также таблица пользователей, которые могут иметь один и тот же CUSTOMERID. Пользователи могут создавать несколько кампаний с тем же CustomerId, что создает проблемы для параллелизма.

ответ

0

Возможно, вы захотите изучить шаблон HiLo или просто использовать Guid.NewGuid() вместо увеличения.

См: HiLO for the Entity Framework

What's the Hi/Lo algorithm?

+0

Я проверю это. Я забыл упомянуть, что руководство не было вариантом. Идентификаторы должны быть целыми числами. – Jeff

+0

Я не уверен, будет ли алгоритм HiLo работать для меня. Несколько вопросов: Является ли 'CustomerId' в основном параметром Hi и параметром' CampaignId' Lo? Будет ли несколько клиентов иметь дубликат 'CampaignId'? Если я не устанавливаю значение Max Lo достаточно высоким, означает ли это, что у Клиентов ограниченное количество 'CampaignId', которые они могут назначить до того, как будет выпущен новый 'CustomerId'? – Jeff

+0

Ну, вы можете использовать CustomerId как параметр Hi, но campaignId - это идентификатор, который вы пытаетесь создать с помощью алгоритма HiLo. После того, как вы снова прочитали свой вопрос и подумали больше об этом, не похоже, что вам придется беспокоиться о параллелизме в вашей ситуации, так как, надеюсь, единственный клиент собирается создавать только одну кампанию за раз. Я предполагаю, что это нормально, если у customer1 и customer2 есть агитайд 1. – Dodecapus

 Смежные вопросы

  • Нет связанных вопросов^_^