C# 实体框架&x27;这是一种奇怪的急切的装载
我使用实体框架6.1.3。我有一个实体,它引用了另一个实体:C# 实体框架&x27;这是一种奇怪的急切的装载,c#,entity-framework,C#,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> UserD
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; }
}
如果用户选择取消操作,我将撤消对上下文的更改:
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。删除后,结果与删除的项目数相等
你能告诉我为什么吗?我怎么能强迫他们重新装弹
你能告诉我为什么吗
这是因为将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();
}
有趣。当我将states设置为Unchanged时,我希望从数据库中完全重新加载查询。它是从缓存中获取的吗?@Nestor是的,它是从缓存(更改跟踪程序API)中获取的。还有两个其他选项1)您可以重新初始化dbcontext指令2)您可以包括停止ef跟踪实体。我用探查器检查了它,它在第二次运行时也从数据库中获取数据(SQL查询相同)。所以问题出在上下文中的某个地方。或者,即使使用新查询,它也不会重新加载数据吗?尝试在ssms中运行相同的查询。ssms中的查询具有正确的值。只有上下文中的实体没有值。。。真奇怪。。。
UserList.Count(item => item.UserData == null)
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();
}