C# 实体框架查询返回不使用';不符合条件
我有以下代码:C# 实体框架查询返回不使用';不符合条件,c#,entity-framework,C#,Entity Framework,我有以下代码: Book book1 = await DbContext.Set<Book>().Where(x => x.Code == 1).FirstOrDefaultAsync(); book1.Code = 2; DbContext.Entry<Book>(book1).State = EntityState.Modified //This returns book, where book2.Code == 2 Book book2 = await D
Book book1 = await DbContext.Set<Book>().Where(x => x.Code == 1).FirstOrDefaultAsync();
book1.Code = 2;
DbContext.Entry<Book>(book1).State = EntityState.Modified
//This returns book, where book2.Code == 2
Book book2 = await DbContext.Set<Book>().Where(x => x.Code == 1).FirstOrDefaultAsync();
//This returns null
Book book3 = await DbContext.Set<Book>().Where(x => x.Code == 2).FirstOrDefaultAsync();
Book book1=await DbContext.Set().Where(x=>x.code==1.FirstOrDefaultAsync();
book1.代码=2;
DbContext.Entry(book1.State=EntityState.Modified
//这将返回book,其中book2.Code==2
Book book2=await DbContext.Set().Where(x=>x.Code==1.FirstOrDefaultAsync();
//这将返回null
Book book3=await DbContext.Set().Where(x=>x.Code==2.FirstOrDefaultAsync();
我想我知道了为什么会发生这种情况:查询进入数据库,抓取一本书,其中code==1
a获取它(DbContext.SaveChanges()
还没有被调用)。然后实体进入ChangeTracker
,发现有另一个实体具有相同的Id
(但不同的code
),将这两个对象合并为一个对象并返回它。因此,返回的实体具有code==2
我的问题是是否有办法防止这种行为,即我希望DbContext
返回满足查询条件的实体,无论它们是从数据库中获取的还是被ChangeTracker
跟踪的
(使用实体框架2.2.0)
避免这种行为-不要重用EF上下文。考虑使用以避免缓存。entities@Evk我希望在单个事务中执行此代码(其中我有一个DbContext
)。我认为在每次查询/更新之后处理上下文不是一个好主意……顺便说一句,您的代码在概念上非常奇怪。首先查询实体A并对其进行修改,然后查询同一实体A并希望其处于未修改状态(如在数据库中)。现在有两个对象表示同一个数据库实体,其中一个已修改,另一个未修改(如果将AsNoTracking应用于第二个查询,则它将是状态)。是的,这通常被认为是好的设计(尽管我自己更喜欢自己管理上下文的创建,即使是在web应用程序中,因为我受够了像这样的问题,但这是个例外)。总而言之,你现在知道了你的选择——AsNoTracking,使用不同的上下文。顺便说一下:EF并没有“将这两个对象合并为1”-它只是使用change tracker中已经存在的对象,并丢弃它从数据库中获得的对象。