实体框架奇怪的急切加载

时间:2015-05-11 10:55:27

标签: c# entity-framework

我使用Entity Framework 6.1.3。我有一个实体,它有一个对另一个实体的引用:

using System;
using System.Collections.Generic;

public partial class Users
{
    public System.Guid UserID { get; set; }   
    public System.Guid ExtID { get; set; }       
    public Nullable<System.Guid> UserData_UserDataID { get; set; }   
    public virtual UserData UserData { get; set; }

}

我使用以下EF查询来获取所有这些:

 UserList = new ObservableCollection<Users>((from user in db.Users.Include("UserData") 
                                             where user.ExtID == ExtId1   
                                             orderby user.UserData.Title 
                                             select user).ToList());

我的网格首次加载时会正确显示用户。

稍后,我使用以下命令删除了一些用户:

      db.Users.Attach(SelectedUser);
      db.Users.Remove(SelectedUser);
      UserList.Remove(SelectedUser);

如果用户选择取消操作,我将撤消上下文的更改:

var changedEntries = dbContext.ChangeTracker.Entries().Where(x => x.State != EntityState.Unchanged).ToList();
foreach (var entry in changedEntries.Where(x => x.State == EntityState.Deleted))
      {
        entry.State = EntityState.Unchanged;
      }

然后我使用上面的查询重新加载列表。

奇怪的是,新列表与原始列表不同:已删除项目的UserData字段为空。

我使用此代码检查:

UserList.Count(item => item.UserData == null)

在第一次运行时,其结果为0.删除后,结果与删除的项目数相等。

你能告诉我为什么吗?我怎么能强迫他们重装?

1 个答案:

答案 0 :(得分:2)

  

你能告诉我为什么吗?

这是因为将entitystate更改为Unchanged不会重新加载dbcontext。你需要手动重新加载这样的上下文:

var changedEntries = dbContext.ChangeTracker.Entries().Where(x => x.State != EntityState.Unchanged).ToList();
foreach (var entry in changedEntries.Where(x => x.State == EntityState.Deleted))
{
    //No need to set entry to Unchanged
    entry.Reload();
}