C# 使用实体框架多次查询会混合结果
我有一个实体的实例,我试图用同一个实例查询数据库2次或更多次C# 使用实体框架多次查询会混合结果,c#,asp.net,entity-framework,linq-to-entities,C#,Asp.net,Entity Framework,Linq To Entities,我有一个实体的实例,我试图用同一个实例查询数据库2次或更多次 myAppDbEntities db = new myAppDbEntities(); List<user> usersList = db.users.Where(c => c.userid == usrID).ToList(); foreach (user u in usersList) { u.items = db.items.Where(c => c.userid == u.id &&a
myAppDbEntities db = new myAppDbEntities();
List<user> usersList = db.users.Where(c => c.userid == usrID).ToList();
foreach (user u in usersList)
{
u.items = db.items.Where(c => c.userid == u.id && c.date == today).ToList();
item extraItem = db.items.Where(c => c.userid == u.id && c.date == yesterday).FirstOrDefault();
//...
}
return usersList;
myAppDbEntities db=new myAppDbEntities();
List usersList=db.users.Where(c=>c.userid==usrID.ToList();
foreach(用户列表中的用户u)
{
u、 items=db.items.Where(c=>c.userid==u.id&&c.date==today).ToList();
item extraItem=db.items.Where(c=>c.userid==u.id&&c.date==beday).FirstOrDefault();
//...
}
返回用户列表;
问题是,当返回usersList时,extraItem将包含在用户的items列表中
我获取的所有数据似乎都是彼此关联的
谢谢如果您在用户和项目之间定义了外键,usersList是指向myAppDbEntities.users的指针,因此无论您事先从数据库中获取什么,如果您找到一个用户并请求它的项目,则实体框架将转到数据库并获取它的所有项目,除非您当时给它一个过滤器 为了停止此行为并显式控制加载的实体,必须从上下文中删除该实体。下面是我使用EF 6.0测试此行为的代码示例:
private void Button_Click(object sender, RoutedEventArgs e)
{
var parents = GetParents();
foreach (var parent in parents)
{
Console.WriteLine(@"Parent: " + parent.ParentId);
foreach (var child in parent.Children)
{
Console.WriteLine(@"Child: " + child.ChildId);
}
}
}
private List<Parent> GetParents()
{
var context = new EFTestDBEntities();
var parentList = context.Parents.Where(x => x.ParentId == 1).ToList();
foreach (var parent in parentList)
{
// Commenting out the following line makes the above Console.WriteLines enumerate all children
((IObjectContextAdapter)context).ObjectContext.Detach(parent);
parent.Children = context.Children.Where(x => x.ChildId == 1).ToList();
}
return parentList;
}
private void按钮\u单击(对象发送者,路由目标)
{
var parents=GetParents();
foreach(父对象中的var父对象)
{
Console.WriteLine(@“Parent:+Parent.ParentId);
foreach(parent.Children中的变量child)
{
Console.WriteLine(@“Child:+Child.ChildId);
}
}
}
私有列表GetParents()
{
var context=新的EFTestDBEntities();
var parentList=context.Parents.Where(x=>x.ParentId==1.ToList();
foreach(parentList中的var parent)
{
//注释掉下面的行会使上面的Console.WriteLines枚举所有子级
((IObjectContextAdapter)context.ObjectContext.Detach(父级);
parent.Children=context.Children.Where(x=>x.ChildId==1.ToList();
}
返回父列表;
}
解决方案是对要独立的查询使用AsNoTracking():
myAppDbEntities db = new myAppDbEntities();
List<user> usersList = db.users.Where(c => c.userid == usrID).ToList();
foreach (user u in usersList)
{
u.items = db.items.Where(c => c.userid == u.id && c.date == today).ToList();
item extraItem = db.items.Where(c => c.userid == u.id && c.date == yesterday).**AsNoTracking()**.FirstOrDefault();
//...
}
return usersList;
myAppDbEntities db=new myAppDbEntities();
List usersList=db.users.Where(c=>c.userid==usrID.ToList();
foreach(用户列表中的用户u)
{
u、 items=db.items.Where(c=>c.userid==u.id&&c.date==today).ToList();
item extraItem=db.items.Where(c=>c.userid==u.id&&c.date==beday)。**AsNoTracking()**.FirstOrDefault();
//...
}
返回用户列表;
如果您注释掉“item extraItem”行,它还会发生吗?不,如果我不使用“db”查询任何其他内容,结果就是我想要的结果。我还注意到,如果我重新初始化db=newmyappdbentities();它也起作用。我担心这样做是否正确?在每次新查询之前重新初始化db实例@EricScherrerI我被难住了,但从另一方面来说,这并不是奇怪的事情,这就是为什么我通常不从我的资源访问中返回EF对象,而是使用像AutoMapper这样的框架来返回DTO。我正在尝试重新创建它-在用户和项目之间的数据库中是否有外键?我怀疑u.items是指向加载到数据库中的任何实体的指针该用户id的items集合。因此,如果从db加载它,它将存在于u.items集合中。这就是我从EF时代回忆起的,现在正在验证。