【问题标题】:After running a LINQ over an Entity the SaveChanges method throw an Exception在实体上运行 LINQ 后,SaveChanges 方法会引发异常
【发布时间】:2013-04-10 05:56:11
【问题描述】:

这是我的课

public class Employee
{
     public virtual List<Salary> Salaries { get; set; }
     public bool CanAddSalary(Salary salary)
     {
          var count = (from x in Salaries where x.Month == salary.Month
                           && x.Year == salary.Year select x).Count();
          return count == 0;
     }
     public void AddSalary(Salary salary)
     {
          if(CanAddSalary(salary))
          {
              Salaries.Add(salary);
          }
     }
}  
  1. Entity Framework 加载具有 Salaries 属性的 Employee。
  2. CanAddSalary 方法只是检查以避免重复(没有修改 Salaries Collection 对吗?)。
  3. 如果 CanAddSalary 返回 true,则调用 AddSalary 方法。
  4. 我调用 Entity Framework Context.SaveChanges() 并抛出异常。

【问题讨论】:

  • 请重新定义措辞,它令人困惑。
  • 你得到了什么异常?
  • 操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
  • 您确定您所概述的是唯一正在执行的事情吗,当您从集合中删除某些东西但关系不是时,这种异常通常会发生设置为级联删除或外键不可为空。因此,已“删除”的对象将保留在 db 中,带有“集合”对象的 NULL 外键 - 您的 db 不会“一致”,因此 EF 会引发异常。答案 - 将外键标记为 Nullable 或设置级联删除或将“子”添加到另一个“集合”,从而将外键设置为新值而不是 null
  • (Ran out of chars) .. 您选择哪个选项取决于正在运行的其他内容,上面显示的代码(单独)不能产生您的异常重新描述。

标签: linq collections entity-framework-5


【解决方案1】:

你应该在你的返回语句中使用==而不是=,否则你总是会从CanAddSalary方法中得到false

 public bool CanAddSalary(Salary salary)
 {
      var count = (from x in Salaries where x.Month == salary.Month
                       && x.Year == salary.Year select x).Count();
      return count == 0;
 }

【讨论】:

  • 在实际代码中是可以的,这里我在输入时犯了一些错误。对不起。
【解决方案2】:

你的薪水真的应该是

ICollection<Salary>

并且执行 Any() 将比执行 Count() 更快

你的

return count = 0;

是错误的,这意味着

Salaries.Add(salary);

正在添加薪水集合中已经存在的薪水,这可能是例外

试试这个,如果你仍然遇到异常,那么也在这里发布,以便我们看到错误

干杯 斯图

public class Employee
{
 public virtual ICollection<Salary> Salaries { get; set; }
 public bool CanAddSalary(Salary salary)
 {
      return !(from x in Salaries where x.Month == salary.Month
                       && x.Year == salary.Year select x).Any();
 }
 public void AddSalary(Salary salary)
 {
      if(CanAddSalary(salary))
      {
          Salaries.Add(salary);
      }
 }
}  

【讨论】:

  • 你改成“return !(from x in Salaries where x.Month == Salary.Month && x.Year == Salary.Year select x).Any();” - 这是最重要的一点 ;-)
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多