2011-05-16 124 views
19

我在ASP.NET MVC 3 Web应用程序中使用实体框架“代码优先”方法。在我的数据库中,我有几个计算列。我需要使用这些列来显示数据(工作正常)。实体框架代码第一个计算属性

但是当我来到行插入这个表,我发现了以下错误:

The column "ChargePointText" cannot be modified because it is either a computed column or is the result of a UNION operator.

有没有办法在我的课为只读标记属性?

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; } 
} 
+1

是的,你是对的 - 我的回答是不正确的。只有当你想让EF生成数据库时,它才能工作。将更新发布为答案并接受它。 – 2011-05-16 09:39:53

回答

33

我找到了解决方案。实体框架提供了一个名为DatabaseGenerated的数据注释。使用这样的:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string ChargePointText { get; set; } 

这里获得更多详细信息:http://msdn.microsoft.com/en-us/library/gg193958.aspx

+0

你能够得到这个更新的工作?特别是对于模型类的“LastUpdatedOn”属性的“DateTime”属性? – 2016-03-12 19:03:57

2

有一对夫妇的其他选择。

首先是从在映射文件更改属性设置:

this.Property(t => t.Name) 
    .HasMaxLength(152); 

到:

this.Property(t => t.Name) 
    .HasMaxLength(152) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

这是几乎一样同Huggill的解决方案,它除了保留这个配置在映射中,而不是在模型中。我觉得这样稍微好一些,因为映射类已经包含了告诉实体框架如何加载该类型实体的代码,所以计算字段的知识就属于这种情况。

另一种选择是NotMappedAttribute,其可以适用于实体的各个属性,像这样:

public class User 
{ 
    ... 

    [NotMapped] 
    public string Name 
    { 
     get; 
     set; 
    } 

    ... 
} 

这是当实体包含未从数据库中填充性质是有用的,但它应该是在OP所面临的情况下同样有用,即EF不会尝试推出标有NotMappedAttribute的财产的价值,因此插入应该起作用。

+3

他正在尝试使用计算的数据库字段。 “NotMapped”不会帮助他做到这一点。 – 2014-01-26 21:52:56

+0

你读过我写的完整答案吗? – 2014-01-27 11:14:13

+2

是的。我做到了。使用未映射的属性不会帮助他在他的应用程序中显示db计算的字段,除非他也想在他的应用程序中计算它们。 – 2014-01-28 20:48:48

相关问题