我有一个带有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与已创建的标记相关联。
我该如何解决这个问题?