【问题标题】:Entity framework Attach error after a query实体框架在查询后附加错误
【发布时间】:2017-09-25 00:47:25
【问题描述】:

如果在对同一数据库实体进行查询之后,实体的附加为什么会引发异常。

附加“文章”类型的实体失败,因为另一个实体 相同的类型已经具有相同的主键值。这可能发生 当使用“附加”方法或将实体的状态设置为 “未更改”或“已修改”,如果图中的任何实体具有 键值冲突。这可能是因为一些实体是新的并且 尚未收到数据库生成的键值。在这种情况下使用 'Add' 方法或 'Added' 实体状态来跟踪图形和 然后将非新实体的状态设置为“未更改”或“已修改” 视情况而定。

在附加语句之前删除查询使其按预期工作。

我的控制器:

public JsonResult Update(Article entity)
{
    JsonResult jRes = new JsonResult();
    ArticleDA repo = new ArticleDA();
    jRes.Data = repo.Update(entity);
    return jRes;
}

我的模特

public Result Update(Article entity)
{
    Result result = new Result();
    using (Entities entities = new Entities())
    {
        try
        {
            var article = entities.Article.Where(x => x.id == entity.id).FirstOrDefault();
            entities.Article.Attach(entity);
            entities.Entry(entity).State = EntityState.Modified;

            entities.SaveChanges();
            result.OK = true;
        }
        catch (Exception err)
        {
            result.OK = false;
        }
    }
    return result;
}

我知道附加语句之前的查询没有意义,但我只是想知道为什么在附加语句之前查询数据库会引发异常。

是否因为在数据库中查询具有该 ID 的实体使其可用于 EntityFramework?

请你解释一下为什么会这样?

【问题讨论】:

  • 您可以检查article,如果存在则使用entities.Entry(article ).State = EntityState.Detached;删除本地化它
  • 通过查询,您将具有与参数实体相同 ID 的 Article 拉入上下文。如果您随后尝试添加参数,它将失败,因为 Id 已经存在。
  • 哈,这很有道理@Mats391,谢谢 ;-)

标签: c# .net asp.net-mvc entity-framework


【解决方案1】:

如果你只想忽略错误,试试var article = entities.Article.AsNoTracking().Where(x => x.id == entity.id).FirstOrDefault();

如果您想知道为什么会这样,请等待我的完整回答

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多