是否可以在调用DbContext.SaveChanges之前查询实体框架?

JKa*_*r11 28 c# entity-framework savechanges dbcontext entity-framework-5

在这个简单的例子中,我有两个实体:Event和Address.我每晚都运行一个控制台应用程序来从XML源导入事件数据并将其添加到我的数据库中.

当我遍历XML事件节点(在Entity Framework上下文中)时,我检查是否有数据库中已存在给定值的地址记录.如果没有,它会添加一条新记录.

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();
}
Run Code Online (Sandbox Code Playgroud)

我知道在每个事件之后调用context.SaveChanges()的性能较慢,所以我想在最后完成所有这些(或者分批进行,但这与此问题无关).但是,当我查询context.Addresses时,它似乎不知道任何新的地址,直到我调用context.SaveChanges()后,我得到重复的记录.

为了我的目的,可以在每个记录之后而不是在结尾时保存,但我想知道是否有一个好的,简单的替代方案.

Ali*_*eza 26

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

见:

为什么Entity Framework查询不返回未保存的实体

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

  • 值得注意的是,本地不仅可以保存添加的对象,还可以删除和修改对象. (2认同)
  • 微软数据开发中心@vishalsharma不同意你的意见.他们说已删除的实体未包含在本地集合中:http://msdn.microsoft.com/en-us/data/jj592872.aspx. (2认同)