我在ASP.NET MVC 3 Web应用程序中使用Entity Framework“Code First”方法。在我的数据库中,我有几个计算列。我需要使用这些列来显示数据(工作正常)。
但是当我在这个表中插入行时,我收到以下错误:
列“ChargePointText”不能 修改,因为它是一个 计算列或是a的结果 UNION运营商。
有没有办法在我班上将该属性标记为只读?
public class Tariff
{
public int TariffId { get; set; }
public int Seq { get; set; }
public int TariffType { get; set; }
public int TariffValue { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public int ChargePoint { get; set; }
public string ChargePointText { get; set; }
}
答案 0 :(得分:33)
我找到了解决方案。实体框架提供了一个名为DatabaseGenerated的数据注释。像这样使用它:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string ChargePointText { get; set; }
在此处获取更多详细信息:http://msdn.microsoft.com/en-us/library/gg193958.aspx
答案 1 :(得分:2)
还有其他几种选择。
第一种是从以下位置更改映射文件中的属性设置:
this.Property(t => t.Name)
.HasMaxLength(152);
为:
this.Property(t => t.Name)
.HasMaxLength(152)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
这与Same Huggill的解决方案几乎相同,不同之处在于它将此配置保留在映射中,而不是模型中。我觉得这稍微好一些,因为映射类已经包含告诉实体框架如何加载该类型实体的代码,因此计算字段的知识属于那里。
另一个选项是NotMappedAttribute
,它可以应用于实体的各个属性,如下所示:
public class User
{
...
[NotMapped]
public string Name
{
get;
set;
}
...
}
当实体包含未从数据库填充的属性时,这很有用,但它在OP面临的场景中应该同样有用,即EF不会尝试在标有{的属性中推送值。 {1}},因此插入应该有用。