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

时间:2011-05-19 21:43:03

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

我知道这个问题已被提出/回答,但我找不到它的生命。

我正在创建带有现有数据库的ASP.NET MVC 3应用程序,但是想先代码,所以我使用了EF Power Tools CTP1让我入门。最终,我将重构一个更好的解决方案,但为了开始,我使用MVCScaffolding生成控制器和视图。我正在努力在我的模型上创建显示值(FullName)属性,该属性是数据库中FirstNameLastName列的组合。

我有一个简单的课程

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映射,或者我是以完全错误的方式进行此操作?

2 个答案:

答案 0 :(得分:2)

不可以创建FullName映射。但是你可以使用这个简单的解决方法:

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顺序排序或搜索 - 您仍必须使用{{1} }和FirstName)。

如果您使用新Power Tools的代码生成功能,您应该按照@Steve Mallory的建议在单独的分部类中声明此属性 - 如果您想要重新生成它,请不要修改生成的代码。

答案 1 :(得分:1)

我不会在数据库中映射该字段。相反,我会将我的POCO声明为部分。在另一个文件中,我会有相同的分部类并在那里定义组合值(只有一个getter)。如果需要,我会提供示例代码。

将它保存在单独的文件中有助于您以后进行任何代码生成。