首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >实体框架代码优先计算属性

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

Stack Overflow用户
提问于 2011-05-16 17:18:19
回答 2查看 18.2K关注 0票数 19

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

然而,当我在这个表中插入行时,我得到了以下错误:

无法修改列"ChargePointText“,因为它要么是计算列,要么是UNION运算符的结果。

有没有办法在我的类中将属性标记为只读?

代码语言:javascript
复制
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; }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-16 20:50:33

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

代码语言:javascript
复制
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string ChargePointText { get; set; }

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

票数 35
EN

Stack Overflow用户

发布于 2013-06-21 07:18:04

还有一些其他的选择。

第一种方法是将映射文件中的属性设置从:

代码语言:javascript
复制
this.Property(t => t.Name)
    .HasMaxLength(152);

至:

代码语言:javascript
复制
this.Property(t => t.Name)
    .HasMaxLength(152)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

这与same Huggill的解决方案基本相同,只是它将此配置保留在映射中,而不是模型中。我觉得这样稍微好一点,因为映射类已经包含了告诉entity Framework如何加载该类型实体的代码,所以字段被计算的知识就属于其中。

另一个选项是NotMappedAttribute,它可以应用于实体的各个属性,如下所示:

代码语言:javascript
复制
public class User
{
    ...

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

    ...
}

这在实体包含不是从数据库填充的属性时很有用,但在OP面临的情况下也同样有用,即EF不会尝试推送标记为NotMappedAttribute的属性中的值,因此insert应该可以工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6015271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档