无法从ISet集合中删除项目

时间:2016-05-02 16:02:09

标签: c# entity-framework

我有以下课程:

public class Test
{
  ...
  public ISet<CategoryAssignment> Categories { get; } = new HashSet<CategoryAssignment>();

  public void LinkWithCategory(Category category)
  {
    Categories.Add(new CategoryAssignment(category, this));
  }

  public void RemoveCategoryLink(int categoryId)
  {
    var categoryAssignment = Categories.FirstOrDefault(c => c.CategoryId == categoryId);
    Categories.Remove(categoryAssignment);
  }
}

但是在调用RemoveCategoryLink()方法时会出现以下错误:

  

因为一个或多个关系无法改变   外键属性是不可为空的。当对a进行更改时   关系,相关的外键属性设置为空值。   如果外键不支持空值,则为新关系   必须定义外键属性必须另外分配   必须删除非空值或不相关的对象。

为什么CategoryAssignment类中的外键必须可以为空? 如何从ISet集合中删除项目?

由于

1 个答案:

答案 0 :(得分:0)

虽然我同意MethodMan这个问题似乎与Masaud提出的问题重复,但我觉得您的以下代码存在问题:

public static boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

问题:FirstOrDefault - 如果未找到匹配项,此方法将返回第一个匹配项或默认值(在您的情况下可以为null)。因此,如果发生这种情况,您的categoryAssignment对象可能为null。 在那种情况下,以下声明:

public void RemoveCategoryLink(int categoryId)
  {
    var categoryAssignment = Categories.FirstOrDefault(c => c.CategoryId == categoryId);
    Categories.Remove(categoryAssignment);
  }

会抛出错误。我并不是说你得到的错误来自于此,但值得尝试修改你的代码:

Categories.Remove(categoryAssignment);