【问题标题】:Entity Framework Code First Computed Properties实体框架代码优先计算属性
【发布时间】:2011-05-16 09:18:19
【问题描述】:

我在 ASP.NET MVC 3 Web 应用程序中使用实体框架“代码优先”方法。在我的数据库中,我有几个计算列。我需要使用这些列来显示数据(效果很好)。

但是,当我在此表中插入行时,出现以下错误:

“ChargePointText”列不能 修改,因为它要么是 计算列 or 是 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; }
}

【问题讨论】:

  • 是的,你是对的 - 我的回答不正确。仅当您希望 EF 生成数据库时,它才起作用。发布您的更新作为答案并接受它。

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


【解决方案1】:

我找到了解决方案。 Entity Framework 提供了一个名为 DatabaseGenerated 的数据注释。像这样使用它:

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

在此处获取更多详细信息:http://msdn.microsoft.com/en-us/library/gg193958.aspx

【讨论】:

  • 你是否能够让它为更新工作?特别是对于模型类的“LastUpdatedOn”属性的“DateTime”属性?
【解决方案2】:

还有其他几个选项。

首先是将映射文件中的属性设置从:

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 不会尝试将值推送到标有 @ 的属性中987654325@,因此插入应该可以工作。

【讨论】:

  • 他正在尝试使用计算数据库字段。 “NotMapped”不会帮助他做到这一点。
  • 是的。我做到了。使用 not mapped 属性不会帮助他在他的应用程序中显示 db 计算字段,除非他也想在他的应用程序中计算它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2011-08-06
相关资源
最近更新 更多