我有一个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