CodeFirst访问另一个虚拟财产的属性

时间:2015-06-24 09:40:26

标签: c# asp.net-mvc entity-framework

我在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 { }
   }
}

AmountAmountWithTax是计算属性,我在UI中不需要它们,但我需要将它们保存在数据库中。问题是当我创建一个新的OrderLine时,属性Tax为空(TaxID被填充并包含int值)所以AmountWithTax会抛出异常。

如何访问Rate属性?

重现的步骤:

将两个模型添加到标准ASP.NET MVC EF项目中,使用右键单击创建脚手架项目 - >添加>新的脚手架项目...... - > MVC5 ...与EntityFramework - >并在Model Class中选择模型。

Visual Studio将生成控制器和视图,如果CreateLine是由Create视图创建的,则属性Tax.Rate会抛出NullReferenceException,因为Tax为null

1 个答案:

答案 0 :(得分:0)

您应该使用ViewModels,而不是实体模型。使用将所需属性映射到实体模型的视图模型应该为您修复它。

如果您不想这样,可以按照How do you exclude properties from binding when calling UpdateModel()?中的说明排除绑定属性:

[Bind(Exclude="Amount,AmountWithTax")]

这会让模型绑定器忽略这些属性,导致不调用它们set

顺便说一句,AmountAmountWithTax的设置者会导致StackOverflowException,因为他们正在为自己分配一个值。您只需删除set即可将其设为只读。