获取或附加实体

时间:2016-01-28 10:07:21

标签: c# sql-server entity-framework entity-framework-6

我有以下方法:

public bool RemoveBookCategories(IDictionary<Books, IList<C_Category>> books)
    {
        _context.Configuration.AutoDetectChangesEnabled = true;

        foreach (var book in books.Keys)
        {
            foreach (var category in books[book])
            {
                if (!_context.ChangeTracker.Entries<Books>().Any(e => e.Entity.BookId == book.BookId))
                    _context.Books.Attach(book);
                if (!_context.ChangeTracker.Entries<C_Category>().Any(e => e.Entity.Id == category.Id))
                    _context.C_Category.Attach(category);

                book.C_Category.Remove(category);
            }
        }

        if (_context.SaveChanges() > 0)
            return true;

        return false;
    }

它按预期工作..有时候。 其他时候我收到此错误消息:

  

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

尽管我觉得这几乎是我试图避免在变换跟踪器中寻找实体的原因。 我觉得我已经尝试了所有可以找到的解决方案,但没有任何效果: - /

任何帮助将不胜感激: - )

2 个答案:

答案 0 :(得分:0)

仔细检查您附加的实体的导航属性:类别可能具有Books属性,其他书籍又具有其他类别。 EF将遍历整个图表并附加它可以达到的每个实体,从而产生上述问题。尝试消隐一些您不需要处理的导航属性。

我敢打赌,在保存具有一个或多个共同类别的图书清单时,您会遇到此异常。

答案 1 :(得分:0)

我通过将我的模型附加到新实例化的上下文然后将更改保存到那个上面来解决这个问题。 这表明我正在使用不同的上下文检索有关书籍和类别的数据,然后尝试将更改保存到另一个上下文中。