我在一个ASP.NET MVC3Web应用程序中使用了实体框架“代码优先”的方法。在我的数据库中,我有几个计算列。我需要使用这些列来显示数据(这很好用)。
然而,当我在这个表中插入行时,我得到了以下错误:
无法修改列"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; }
}
发布于 2011-05-16 20:50:33
我已经找到解决方案了。实体框架提供了一个名为DatabaseGenerated的数据注释。像这样使用它:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string ChargePointText { get; set; }
点击此处获取更多详细信息:http://msdn.microsoft.com/en-us/library/gg193958.aspx
发布于 2013-06-21 07:18:04
还有一些其他的选择。
第一种方法是将映射文件中的属性设置从:
this.Property(t => t.Name)
.HasMaxLength(152);
至:
this.Property(t => t.Name)
.HasMaxLength(152)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
这与same Huggill的解决方案基本相同,只是它将此配置保留在映射中,而不是模型中。我觉得这样稍微好一点,因为映射类已经包含了告诉entity Framework如何加载该类型实体的代码,所以字段被计算的知识就属于其中。
另一个选项是NotMappedAttribute
,它可以应用于实体的各个属性,如下所示:
public class User
{
...
[NotMapped]
public string Name
{
get;
set;
}
...
}
这在实体包含不是从数据库填充的属性时很有用,但在OP面临的情况下也同样有用,即EF不会尝试推送标记为NotMappedAttribute
的属性中的值,因此insert应该可以工作。
https://stackoverflow.com/questions/6015271
复制相似问题