实体框架4.1代码优先从两个数据库列映射/填充单个属性

问题描述

| 我知道这个问题已经被问到/回答了,但是我一生都找不到。 我正在使用现有数据库创建ASP.NET MVC 3应用程序,但想先编写代码,所以我使用EF Power Tools CTP1入门。最终,我将重构为一个更好的解决方案,但为了开始,我使用了ѭ0来生成控制器和视图。我正在努力在模型上创建显示值(
FullName
属性,该属性数据库
FirstName
​​和
LastName
列的组合。 我有一堂简单的课
public class Manager
{
    public Manager(){}

    public int ManagerID { get; set; }

    [displayName] // Not in db.. want to populate this from first & last name 
    public  string FullName { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}
一个看起来像的映射文件
     public ManagerMap()
    {
        // Primary Key
        this.HasKey(t => t.ManagerID);

        // Table & Column Mappings
        this.ToTable(\"Manager\");
        this.Property(t => t.ManagerID).HasColumnName(\"ManagerID\");

        this.Property(t => t.FirstName).HasColumnName(\"FirstName\");
        this.Property(t => t.LastName).HasColumnName(\"LastName\");
        this.Property(t => t.Email).HasColumnName(\"Email\");
        this.Property(t => t.FullName).WhatTodo..? //<-- Can I / how does this mapping look

    }
}
是否可以创建
FullName
映射,或者我将以完全错误的方式进行操作?     

解决方法

不可以,无法创建“ 1”映射。但是您可以使用以下简单的解决方法:
public class Manager
{
    public Manager(){}

    public int ManagerID { get; set; }

    [NotMapped]
    public string FullName 
    { 
       get
       {
           return FirstName + \" \" + LastName;
       }
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}
这种方法的唯一缺点是,您不能在linq-to-entities查询中使用
FullName
属性(因此,您不能例如通过
FullName
进行订购或搜索-您仍然必须使用
FirstName
LastName
)。 如果您使用新的Power Tools的代码生成功能,则应按@Steve Mallory的建议在单独的部分类中声明此属性-如果要重新生成,请不要修改生成的代码。     ,我不会映射数据库中的字段。相反,我会声明我的POCO为部分。在另一个文件中,我将具有相同的局部类,并在那里定义组合值(仅带有吸气剂)。如果您需要,我有示例代码。 如果以后进行任何代码生成,将其保存在单独的文件中将很有帮助。