2013-07-12 80 views
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是獨一無二的每一個客戶ID;因此,它不能是一個身份。因此,從我的網絡應用程序中,我需要在創建Campaign時自動增加CampaignId。在過去,我不得不在單個交易中獲得一個鎖,以獲得下一個最高價併發行插入。我如何在EF中完成同樣的事情而不必擔心或有效管理併發性?

在運動控制器,我有這個(的UserContext是一個靜態輔助類,檢索用戶的當前客戶編號和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); 
} 

但不會這種風險在每個客戶ID重複的值高併發環境?

編輯:

我忘了提到guid不是一個選項。 Ids必須是整數。

編輯2:

我忘了提及,也有一個用戶表可以具有相同的客戶ID。用戶可以使用相同的CustomerId創建多個Campaigns,這可能會導致併發問題。

回答

0

您可能想要查看一個HiLo模式,或者只是使用Guid.NewGuid()而不是增加。

請參見:HiLO for the Entity Framework

What's the Hi/Lo algorithm?

+0

我會檢查了這一點。我忘了提到一個guid不是一個選項。 Ids必須是整數。 – Jeff

+0

我不確定HiLo算法是否適用於我。幾個問題: 「CustomerId」基本上是Hi參數,「CampaignId」是Lo參數嗎? 多個客戶可以重複使用CampaignId嗎? 如果我沒有將最大Lo值設置得足夠高,是否意味着客戶有一定數量的'CampaignId's,它們可以在新的'CustomerId'發出之前分配? – Jeff

+0

那麼你可能可以使用CustomerId作爲Hi參數,但是campaignId是你試圖用HiLo算法創建的id。在再次閱讀您的問題並思考更多問題後,您不必擔心自己的情況會出現併發情況,因爲希望單個客戶一次只能創建一個廣告系列。我在這裏假設沒關係,如果customer1和customer2都有1的競選ID。 – Dodecapus