【问题标题】:The difference between Find and Any for Attached entityFind 和 Any for Attached entity 的区别
【发布时间】: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完全一样。

标签: entity-framework-6


【解决方案1】:

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

第二个 sn-p 显然没有实现 Book 实例:它运行的 SQL 查询只返回 bool

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 2018-08-23
    • 2021-01-30
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多