Find和Any for Attached实体之间的区别

时间:2017-09-28 17:32:37

标签: entity-framework-6

我有一个获取stagehand实体的函数,并检查它是否已存在于数据库中。 如果它已经存在,则该函数需要在上下文中更新实体。

因此,当我使用Book函数检查它是否存在时,会抛出以下错误:

  

附加“Books”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。

但是当我使用Find函数检查时,代码工作正常。

我的猜测是Any函数附加实体(上下文)但Find没有这样做。

有人可以给出解释吗?

Any功能:

Find

public IHttpActionResult PutBook(Books book) { if(db.Books.Find(book.id) == null) { db.Entry(book).State = EntityState.Modified; } . . } 功能:

Any

对不起,如果我有英文错误。

1 个答案:

答案 0 :(得分:2)

是的,Find从数据库中提取实体,并将其附加到上下文(如果它尚未在其缓存中)。所以此时在上下文缓存中有一个Book实例,然后您尝试将另一个实例附加到它。这是不允许的,因为EF的缓存被设计为identity map

第二个代码段显然没有实现Book实例:它运行的SQL查询只返回bool