【问题标题】:Creating model property with only getter for view in ASP.NET MVC 4 entity framework在 ASP.NET MVC 4 实体框架中创建仅使用 getter 的模型属性
【发布时间】:2012-10-04 17:43:32
【问题描述】:

我正在使用 asp.net mvc 4 和实体框架代码优先方法。我有以下实体模型

public class User
{
    public virtual int Id { get; set; }
    public virtual String FirstName { get; set; }
    public virtual String MiddleName { get; set; }
    public virtual String LastName { get; set; }
}

对于我需要显示全名的用户列表视图页面,我正在尝试在用户模型中创建一个仅获取属性,例如

public virtual String FullName{
    get{
        return FirstName + " " + MiddleName + " " + LastName;
    }
}

但我不确定它是否会起作用,此外我也不希望实体框架将其映射到数据库列。

我可以使用从其他属性生成的类似 get only 属性来仅查看吗? 任何人都可以给我任何建议吗??

【问题讨论】:

  • 我刚刚发现它可以在视图页面上工作,但是如何防止它与任何类型的数据库映射?

标签: asp.net entity-framework razor


【解决方案1】:

根据您通过 DataAnnotations 或 EntityConfigurationType 类配置域实体的方式,您可以使用 [NotMapped] DataAnnotation

public class User
{
    public virtual int Id { get; set; }
    public virtual String FirstName { get; set; }
    public virtual String MiddleName { get; set; }
    public virtual String LastName { get; set; }
    [NotMapped]
    public virtual String FullName 
    {
        get{
             return FirstName + " " + MiddleName + " " + LastName;
        }
    }
}

或在实现 EntityTypeConfiguration 的特定类中,您可以像这样将属性设置为被 EntityFramework 忽略,然后在 OnModelCreating 事件中将其添加到您的上下文配置集合中:

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        Ignore(u=>u.FullName);
    }
}

【讨论】:

    【解决方案2】:

    如果您将此属性放入模型中是因为您需要在视图中显示它,那么您首先错过了 MVC 的要点。该模型应该以正确描述要使用的数据的方式构建。这可能是也可能不是反映您的数据库结构的实体模型。它也可能正是视图正在寻找的,也可能不是。

    在这种情况下,您必须问自己为什么要将它添加到模型中,以及它是否只是代码膨胀。您已经拥有模型中创建此特定字符串所需的信息。如果视图需要以特定格式显示此信息,则它属于视图。但是,如果您知道您每次都需要在其他几个地方以完全相同的格式使用这种精确的逻辑,那么可以认为该属性属于视图,因为它是数据的更具全局性的描述性实现有问题。

    鉴于您的具体示例,我认为这个只读属性只是代码膨胀。这种性质的东西属于使用这些数据的视图。

    【讨论】:

    • 谢谢你的解释,是的,这只是一个代码膨胀,我只需要一个通用的方法来获取相同格式的字符串。
    • 您认为,我认为最好将其放在静态方法中而不是作为模型属性,对吗?
    • @BurhanUddin:您是否在多个视图中以完全相同的格式使用此属性?
    • 是的,我将在所有需要显示用户名(不是登录用户名)的视图中使用此属性
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多