我在CodeFirst脚手架ASP.NET MVC站点中使用了以下模型(简化):
Public Tax
{
public int ID {get; set; }
public string Name {get; set; }
public decimal Rate {get; set; }
}
Public OrderLine
{
public int ID {get; set; }
public int TaxID {get; set; }
public virtual Tax Tax {get; set; }
public decimal Quantity {get; set; }
public decimal Price {get; set; }
[ScaffoldColumn(false)]
public decimal Amount
{
get { return Quantity * Price; }
set { }
}
[ScaffoldColumn(false)]
public decimal AmountWithTax
{
get { return Amount + (Amount * Tax.Rate / 100); }
set { }
}
}
Amount
和AmountWithTax
是计算属性,我在UI中不需要它们,但我需要将它们保存在数据库中。问题是当我创建一个新的OrderLine
时,属性Tax
为空(TaxID
被填充并包含int值)所以AmountWithTax
会抛出异常。
如何访问Rate
属性?
重现的步骤:
将两个模型添加到标准ASP.NET MVC EF项目中,使用右键单击创建脚手架项目 - >添加>新的脚手架项目...... - > MVC5 ...与EntityFramework - >并在Model Class中选择模型。
Visual Studio将生成控制器和视图,如果CreateLine是由Create视图创建的,则属性Tax.Rate会抛出NullReferenceException
,因为Tax为null
答案 0 :(得分:0)
您应该使用ViewModels,而不是实体模型。使用将所需属性映射到实体模型的视图模型应该为您修复它。
如果您不想这样,可以按照How do you exclude properties from binding when calling UpdateModel()?中的说明排除绑定属性:
[Bind(Exclude="Amount,AmountWithTax")]
这会让模型绑定器忽略这些属性,导致不调用它们set
。
顺便说一句,Amount
和AmountWithTax
的设置者会导致StackOverflowException
,因为他们正在为自己分配一个值。您只需删除set
即可将其设为只读。