由于DbContext.Entity.Local,DbContext防止重复插入

时间:2016-04-20 03:33:27

标签: c# entity-framework

我有一个带有Initialize()方法的类,如果没有名称的标记,它基本上会尝试将“Tags”添加到我的数据库中。这里使用的逻辑很简单:

// Class variables outside of the Initialize() method    
List<Tags> Tags = new List<Tags>();
List<string> TagNames = ...Some values;

public void Initialize()
{
    using (var context = Application.GetDbContext())
    {
        foreach (var tagName in TagNames)
        {
            var tag = context.Tags
            .Include(ti => ti.MonRequests
            .Select(r => r.Profiles))
            .FirstOrDefault<NWatchTag>(
                p => p.Name.Equals(
                    tagName,
                    StringComparison.CurrentCultureIgnoreCase
                    ));

            if (tag == null)
            {
                // Add tag to dbContext
                Trace.TraceInformation("Adding tag '{0}'.", tagName);
                tag = context.Tags.Add(
                    new NWatchTag(tagName)
                    {
                        IsSystem = true
                    }
                );
            }
        }

        context.SaveChanges();

        Tags = context.Tags.Where(x => TagNames.Contains(x.Name)).ToList();
    }
}

这很好用,它只添加一次标记(由名称区分)。

现在,有一种方法尝试使用Tags集合来标记某些节点。逻辑如下:

public void ApplyMonitoringTags(Node node)
{
    using (var context = Application.GetDbContext()) {

        node = context.Nodes.
            Include(x => x.Tags).
            FirstOrDefault(x => x.Id == rootNode.Id);

        foreach (var tag in Tags)
        {
            if (!node.Tags.Contains(tag))
            {
                node.Tags.Add(tag);
            }
        }

        context.SaveChanges();
    }
}

此处,上下文最终将标签添加到context.Tags.Local集合。 当调用SaveChanges()时,它最终会再次为标记执行插入,现在我再次创建了具有相同名称的标记。然后,节点与“新”创建的(重复)标签相关联,而不是与Initialize()方法中创建的标签相关联。

此类会在很长一段时间内重复使用,因此Initialize()方法应创建标记并将其保留在Tags集合中。对ApplyMonitoringTags()的任何调用都应该最终将Node与已创建的标记相关联。

我该如何解决这个问题?

0 个答案:

没有答案