我正在使用EF-Code First,这是我的数据注释模型:
public int Count { get; set; }
public int Fee { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public int Total { get; set; }
或者像这样:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public int Total
{
get { return Fee * Count; }
private set{}
}
当我想创建新记录时,我收到以下错误:
无法将值NULL插入“Total”列;列不允许空值。 INSERT失败。 声明已经终止。
正如您所看到的,我在使用模型绑定器的创建操作方法中获得了正确的计算值:
删除DatabaseGenerated(DatabaseGeneratedOption.Computed)
并从我的代码中设置计算值,它工作正常,我在数据库中看到更新的总数。但我的问题是,如果我可以在没有DatabaseGenerated(DatabaseGeneratedOption.Computed)
的情况下执行此操作,那么DatabaseGenerated(DatabaseGeneratedOption.Computed)
用法是什么?
这有效:
public int Total
{
get { return Fee * Count; }
private set{}
}
答案 0 :(得分:1)
如上所述here和here,您无法更新计算列,因为它的值是从数据库中检索出来的,并且从未发回过。
因此,解决方案是在模型中创建另一个not mapped计算属性,该属性将在您的代码中使用,并将Total
属性映射到数据库:
public int Count { get; set; }
public int Fee { get; set; }
public int Total { get; set; }
[NotMapped]
public int CalculatedTotal
{
get { return Count*Fee; }
}
答案 1 :(得分:0)
尝试声明public int? Total
接受null。