问题描述
|
我在ASP.NET MVC 3 Web应用程序中使用实体框架“代码优先”方法。在我的数据库中,我有几个计算列。我需要使用这些列来显示数据(工作正常)。
但是,当我向该表中插入行时,出现以下错误:
列“ ChargePointText \”不能为
修改,因为它要么是
计算列或是
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; }
}
解决方法
我找到了解决方案。实体框架提供了一个称为DatabaseGenerated的数据注释。像这样使用它:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string ChargePointText { get; set; }
在此处获取更多详细信息:http://msdn.microsoft.com/zh-cn/library/gg193958.aspx
,还有其他两个选择。
第一种是从以下位置更改映射文件中的属性设置:
this.Property(t => t.Name)
.HasMaxLength(152);
至:
this.Property(t => t.Name)
.HasMaxLength(152)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
这与Same Huggill的解决方案几乎相同,除了它在映射中而不是模型中保留此配置。我觉得这会稍微好一点,因为映射类已经包含了告诉Entity Framework如何加载该类型的实体的代码,因此计算字段的知识就属于其中。
另一种选择是“ 4”,它可以应用于实体的各个属性,如下所示:
public class User
{
...
[NotMapped]
public string Name
{
get;
set;
}
...
}
当实体包含未从数据库填充的属性时,这很有用,但是在OP面对的情况下它也应同样有用,即EF不会尝试将值推入标有“ 4”的属性中,因此插入应该管用。