我有一個SQL表稱爲域包含以下幾列:避免因實體框架中插入SQL表重複多工人
我有多個代理(工人)將行插入到數據庫中同一時間,我想避免插入重複的域名。 Id是主鍵,我不願意改變它。
同時林首先檢查是否域這個存在:
public async Task<List<DomainApiModel>> GetListOfExistingDomainsAsync(List<string> domains)
{
using (eTrafficBacklinks_V2Entities EMME_Context = new eTrafficBacklinks_V2Entities())
{
var rec = await EMME_Context.Domains.Where(p => domains.Contains(p.DomainName)).ToListAsync();
return rec.Select(p => new DomainApiModel(p)).ToList();
}
}
然後我過濾那些已經存在的,最後,我插入通過下面的代碼不存在的:
public int Create(List<DomainApiModel> domainApiList, out List<DomainApiModel> domainApiListWithId, int chunkSizeLimit = 500)
{
using (eTrafficBacklinks_V2Entities EMME_Context = new eTrafficBacklinks_V2Entities())
{
EMME_Context.Configuration.AutoDetectChangesEnabled = false;
EMME_Context.Configuration.ValidateOnSaveEnabled = false;
int totalChanges = 0;
var listOfLists = domainApiList.ChunkSplit(chunkSizeLimit).ToList();
var listOfDomainData = new List<Domain>();
foreach (var list in listOfLists)
{
foreach (var apiModel in list)
{
var objectData = apiModel.GetDataObject();
EMME_Context.Domains.Add(objectData);
listOfDomainData.Add(objectData);
}
totalChanges += EMME_Context.SaveChanges();
}
domainApiListWithId = listOfDomainData.Select(d => new DomainApiModel(d)).ToList();
return totalChanges;
}
}
問題是,在檢查域是否存在和創建之間的同時,另一個代理可以插入相同的域,並且我的表中有重複項。
任何人都有如何解決這個問題的光?
觀測值:我有一個名爲的「URL欄」,這是nvarchar950類型頁表同樣的問題,所以只創建唯一索引是沒有辦法了......
如何處理異常?如果我在調用SaveChanges()之前添加多個域,則該異常將取消之前添加的所有域。 – juanora
Okk ...謝謝...但像這樣添加會殺死性能... – juanora
@ juanora「像這樣添加會殺死性能」你不能擁有這一切;-) – Oscar