2

我有一些标签需要插入到标签数据库中。Tag 数据库只有一列“tag”,它也是主键。这是在插入时防止重复的技巧。

所以现在是代码和问题。

foreach (string tagval in tagarray)
{
    try
    {
        var tag = new Tag
        {
            Tag1 = tagval
        };
        db.AddToTags(tag);
    }
    catch
    {
    }
}
db.SaveChanges();

这种方法的问题是,SaveChanges()如果早期发现重复,则在调用后,程序存在而没有保存其他标签。如果我SaveChanges()在每次添加到表后调用,程序将变得低效并且需要进行大量调用。即使在较早的插入失败后如何继续插入?

也欢迎替代解决方案。

4

3 回答 3

1

使用实体框架和ObjectContext派生,你可以做这样的事情。

foreach (var newTag in tagarray.Select(t => 
               new Tag { Tag1 = t }).Except(db.Tags))
{
    db.Tags.AddObject(newTag);
}

try
{
    db.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
}
catch (OptimisitcConcurrencyException)
{
    db.Refresh(RefreshMode.StoreWins, db.Tags);
    foreach (var newTag in tagarray.Select(t => 
                   new Tag { Tag1 = t }).Except(db.Tags))
    {
        db.Tags.AddObject(newTag);
    }
    db.SaveChanges();
}
于 2012-09-06T07:34:36.980 回答
1

您需要在这里更改几件事。首先,您最好先从您自己的列表中删除重复项,然后再通过调用.Distinct您的列表来插入数据库附近的任何位置。

此外,这里不需要 try catch,您应该在插入之前检查数据库中已有的内容。尝试这个:

List<string> uniqueItems = tagarray
    .Distinct()
    .Where(x => !db.Tags.Contains(x))
    .ToList();

foreach (string uniqueItem in uniqueItems)
{
    var tag = new Tag
    {
        Tag1 = tagval
    };
    db.AddToTags(tag);   
}

db.SaveChanges();
于 2012-09-06T07:38:10.290 回答
0
foreach (string tagval in tagarray)
{
    try
    {
        var tag = new Tag
        {
            Tag1 = tagval
        };
      if(Tags.Where(e =>tag ) != null)
        {
        dataContext.AddToTags(tag);
        }
    }
    catch
    {
    }
}
dataContext.SaveChanges();
于 2012-09-06T07:40:53.573 回答