C# 获取或附加实体
我有以下方法:C# 获取或附加实体,c#,sql-server,entity-framework,entity-framework-6,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 categ
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;
}
public bool RemoveBookCategories(IDictionary图书)
{
_context.Configuration.AutoDetectChangesEnabled=true;
foreach(账簿中的var book.key)
{
foreach(账簿中的var类别[账簿])
{
if(!\u context.ChangeTracker.Entries().Any(e=>e.Entity.BookId==book.BookId))
_上下文。书籍。附加(书籍);
if(!\u context.ChangeTracker.Entries().Any(e=>e.Entity.Id==category.Id))
_context.C_Category.Attach(Category);
book.C_Category.Remove(类别);
}
}
如果(_context.SaveChanges()>0)
返回true;
返回false;
}
它按预期工作。。有时候。
其他时候,我会收到以下错误消息:
{"附加“DataAccess.Plusbog.C_Category”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体的状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体存在冲突是新的,尚未收到数据库生成的键值。在这种情况下,请使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。}
尽管我觉得这正是我尽量避免在changetracker中查找实体的原因。
我觉得我已经尝试了我能找到的每一个解决方案,但没有任何效果:-/
任何帮助都将不胜感激:-)仔细检查您要附加的实体的导航属性:类别可能具有Books属性,而其他书籍又具有其他类别。EF将遍历整个图形并附加它可以到达的每个实体,从而产生上述问题。请尝试将某些naviga留空不需要处理的属性
我打赌您在保存具有一个或多个共同类别的书籍列表时会遇到此异常。我通过将模型附加到新实例化的上下文,然后保存对该上下文的更改来解决此问题。
这表明,我正在使用不同的上下文检索有关书籍和类别的数据,然后尝试将更改保存到另一个上下文。当然。这些书籍确实有相同的类别。我只是不知道如何保存这些类别,因为如果它们尚未附加,我将不得不附加它们,否则它们将被删除根本没有保存。我认为在附加之前
book.Categories=null
和category.Books=null
应该会有帮助。遗憾的是,没有骰子。尝试附加时会出现相同的错误。您是否在任何地方使用AsNoTracking来使用上下文获取类别?没有。通过includes获取类别,但没有AsNoTracking您可能会看到我的答案。