我使用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.删除后,结果与删除的项目数相等。
你能告诉我为什么吗?我怎么能强迫他们重装?答案 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();
}