29

在这个简单的示例中,我有两个实体:事件和地址。我每天晚上都有一个控制台应用程序运行,用于从 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() 所以我得到重复记录。

出于我的目的,在每条记录之后而不是最后保存可能是可以的,但我想知道是否有一个好的、简单的替代方案。

4

2 回答 2

27

当您以触及数据库的方式进行查询时,上下文中新添加的实体不会包含在结果中。在 EF 4.1 中,您可以通过DbSet<T>.Local

看 :

为什么实体框架查询不返回未保存的实体

实体框架:重新查找最近添加到上下文中的对象

于 2013-09-19T21:53:56.477 回答
1

直接针对 DbSet 查询将始终向数据库发送查询。Entity Framework 5 中有一个很好的替代方案 – DbSet.Local 属性,可让您使用内存数据(由您自己创建或从数据库加载)。

看这篇文章:http: //msdn.microsoft.com/en-us/data/jj592872.aspx

于 2013-10-13T15:03:19.487 回答