1

我有两张桌子:

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 都是唯一的;因此,它不能是一个身份。因此,从我的网络应用程序中,我需要在创建活动时自动增加活动 ID。过去,我必须在单个事务中获得锁才能获得下一个最高值并发出插入。我如何在 EF 中完成同样的事情而不必担心或有效地管理并发?

在 Campaign 控制器中,我有这个(UserContext 是一个静态助手类,用于检索用户的当前 CustomerId,db 是我的 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 重复值的风险吗?

编辑:

我忘了提到 guid 不是一种选择。Id 必须是整数。

编辑2:

我忘了提到还有一个用户表可以具有相同的 CustomerId。用户可以使用相同的 CustomerId 创建多个活动,这可能会导致并发问题。

4

1 回答 1

0

您可能想研究 HiLo 模式,或者只使用 Guid.NewGuid() 而不是递增。

请参阅:实体框架的 HiLO

什么是 Hi/Lo 算法?

于 2013-07-12T19:59:07.823 回答