【问题标题】:Getting or attaching an entity获取或附加实体
【发布时间】:2016-01-28 19:46:10
【问题描述】:

我有以下方法:

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

尽管我觉得这几乎是我试图避免在 changetracker 中查找实体的原因。 我觉得我已经尝试了所有我能找到的解决方案,但没有任何效果:-/

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

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 当然。这些书确实有共同的类别。我只是不知道如何保存类别,因为如果它们尚未附加,我将不得不附加它们,否则它们根本不会被保存。
  • 我认为 book.Categories = nullcategory.Books = null 在附加之前应该会有所帮助。
  • 遗憾的是,没有骰子。尝试附加时出现相同的错误。
  • 您是否曾在任何地方使用 AsNoTracking 通过 _context 获取类别?
  • 不。通过包含,但没有 AsNoTracking
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    相关资源
    最近更新 更多