插入时防止重复

时间:2012-09-06 07:24:37

标签: c# .net linq entity-framework duplicates

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

现在代码和问题。

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

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

另一种解决方案也受到欢迎。

3 个答案:

答案 0 :(得分:1)

使用Entity Framework和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();
}

答案 1 :(得分: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();

答案 2 :(得分: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();