Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架查询返回不使用';不符合条件_C#_Entity Framework - Fatal编程技术网

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中已经存在的对象,并丢弃它从数据库中获得的对象。