【发布时间】:2017-09-28 17:32:37
【问题描述】:
我有一个获取Book 实体的函数,并检查它是否已存在于数据库中。
如果它已经存在,该函数需要在上下文中更新实体。
所以当我使用Find函数检查是否存在时,抛出如下错误:
附加“图书”类型的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后将非新实体的状态设置为“未更改”或“已修改”。
但是当我使用Any 函数来检查时,代码工作正常。
我的猜测是 Find 函数将实体附加到上下文中,但 Any 没有这样做。
谁能解释一下?
Find 函数:
public IHttpActionResult PutBook(Books book)
{
if(db.Books.Find(book.id) == null)
{
db.Entry(book).State = EntityState.Modified;
}
.
.
}
Any 函数:
public IHttpActionResult PutBook(Books book)
{
if (db.Books.Any(b => b.id.Equals(book.id)))
{
db.Entry(book).State = EntityState.Modified;
}
.
.
}
对不起,如果我有英文错误。
【问题讨论】:
-
能否请您更新您的帖子。例如,
db.Categories可能是db.Books?而且两个代码sn-ps完全一样。