实体框架代码第一个计算属性

时间:2011-05-16 09:18:19

标签: entity-framework ef-code-first entity-framework-4.1

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

2 个答案:

答案 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}},因此插入应该有用。