C# DbContext防止由于DbContext.Entity.Local而重复插入
我有一个类,它有一个Initialize()方法,如果一个名为的标记不存在,它基本上会尝试将“标记”添加到我的数据库中。这里使用的逻辑很简单: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()
// 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();
}
}