Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DbContext防止由于DbContext.Entity.Local而重复插入_C#_Entity Framework - Fatal编程技术网

C# DbContext防止由于DbContext.Entity.Local而重复插入

C# DbContext防止由于DbContext.Entity.Local而重复插入,c#,entity-framework,C#,Entity Framework,我有一个类,它有一个Initialize()方法,如果一个名为的标记不存在,它基本上会尝试将“标记”添加到我的数据库中。这里使用的逻辑很简单: // Class variables outside of the Initialize() method List<Tags> Tags = new List<Tags>(); List<string> TagNames = ...Some values; public void Initialize()

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

// 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();
    }
}
在这里,上下文最终将标记添加到
context.Tags.Local
集合中。 当调用
SaveChanges()
时,它会再次插入标记,现在我又创建了同名的标记。然后,该节点与“新”创建的(重复)标记相关联,而不是在
Initialize()
方法中创建的标记

此类会在很长一段时间内重复使用,因此
Initialize()
方法应该创建标记并在
tags
集合中维护它们。对
ApplyMonitoringTags()
的任何调用最终都会将节点与已创建的标记关联起来

我该怎么做

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();
    }
}