实体框架多对多更新错误

时间:2018-05-18 15:26:51

标签: c# asp.net linq entity-framework-6

我的数据库中有多对多的关系。在更新实体时一切正常,但从集合中删除旧对象会引发错误。

public void Update(CourseGroup courseGroupToUpdate)
{
    try
    {
        var courseGroup = _context.CourseGroups
                                  .Include("PricingSchedule")
                                  .Include("GroupCourses")
                                  .AsNoTracking()
                                  .SingleOrDefault(cg => cg.Id == courseGroupToUpdate.Id && 
                                                         cg.IsActive == true);

        var coursesToDelete = courseGroup.GroupCourses.ExceptBy(courseGroupToUpdate.GroupCourses, cg => cg.CourseId).ToList();
        var coursesToAdd = courseGroupToUpdate.GroupCourses.ExceptBy(courseGroup.GroupCourses, cg => cg.CourseId).ToList();

        _context.Entry(courseGroupToUpdate).State = EntityState.Modified;

        _context.GroupCourses.RemoveRange(coursesToDelete);
        _context.GroupCourses.AddRange(coursesToAdd);
        _context.Entry(courseGroupToUpdate.PricingSchedule).State = EntityState.Modified;

        _context.SaveChanges();
    }

上述代码可以正常工作,除了这一行:

 _context.GroupCourses.RemoveRange(coursesToDelete);

执行时,抛出此错误:

  

无法删除对象,因为在ObjectStateManager中找不到该对象。

如何解决此问题?

2 个答案:

答案 0 :(得分:0)

我相信你使用ToList()是从对象上下文中取消附加实体。您可以删除多余的ToList()调用,也可以手动重新附加实体。

试试这个:

var coursesToDelete = courseGroup.GroupCourses.ExceptBy(courseGroupToUpdate.GroupCourses, cg => cg.CourseId);
_context.GroupCourses.RemoveRange(coursesToDelete);

或者这个:

var coursesToDelete = courseGroup.GroupCourses.ExceptBy(courseGroupToUpdate.GroupCourses, cg => cg.CourseId).ToList();

context.Attach(coursesToDelete);
_context.GroupCourses.RemoveRange(coursesToDelete);

答案 1 :(得分:0)

sed '/^option1.* = /!d;s///' somefile 选项是否意味着您不会拥有grep -oP '^option1.* = \K.*' somefile 中的对象?我认为删除可能会解决您的问题。

在没有sed '/^option1.* = /!d;s///;q' somefile grep -m1 -oP '^option1.* = \K.*' somefile 调用的情况下尝试查询,看看会发生什么。