在这个简单的示例中,我有两个实体:事件和地址。我每天晚上都有一个控制台应用程序运行,用于从 XML 源导入事件数据并将其添加到我的数据库中。
当我遍历 XML 事件节点(在实体框架上下文中)时,我检查数据库中是否已经存在具有给定值的地址记录。如果没有,它会添加一条新记录。
using (DemoContext context = new DemoContext())
{
foreach (XmlNode eventNode in eventsXml.SelectNodes("/Events/Event"))
{
Event newEvent = new Event();
newEvent.Title = **get from XML**
Address address = context.Addresses.Where(a =>
a.Title.Equals(title, StringComparison.OrdinalIgnoreCase) &&
a.Address1.Equals(address1, StringComparison.OrdinalIgnoreCase) &&
a.Address2.Equals(address2, StringComparison.OrdinalIgnoreCase) &&
a.City.Equals(city, StringComparison.OrdinalIgnoreCase) &&
a.State.Equals(state, StringComparison.OrdinalIgnoreCase) &&
a.ZipCode.Equals(zipCode, StringComparison.OrdinalIgnoreCase)
).FirstOrDefault();
if (address != null)
newEvent.Location = address;
else
{
newEvent.Location.Title = title;
newEvent.Location.Address1 = address1;
newEvent.Location.Address2 = address2;
newEvent.Location.City = city;
newEvent.Location.State = state;
newEvent.Location.ZipCode = zipCode;
}
context.Events.Add(newEvent);
}
context.SaveChanges();
}
我知道在每个事件之后调用 context.SaveChanges() 会降低性能,所以我想在最后做这一切(或者分批做,但这与这个问题无关)。但是,当我查询 context.Addresses 时,它似乎不知道任何新地址,直到我调用 context.SaveChanges() 所以我得到重复记录。
出于我的目的,在每条记录之后而不是最后保存可能是可以的,但我想知道是否有一个好的、简单的替代方案。