实体框架代码优先计算属性

问题描述

| 我在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”的属性中,因此插入应该管用。