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

问题描述:

我知道这个问题已被问到/回答,但我无法为我的生活找到它。实体框架4.1代码首先映射/填充来自两个数据库列的单个属性

我正在创建和ASP.NET MVC 3应用程序与现有的数据库,但要先去代码,所以我用EF电源工具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映射还是我要对这个完全错误的方式映射文件?

不,不可能创建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到实体查询中使用FullName属性(所以你不能例如命令或FullName搜索 - 你仍然必须使用FirstNameLastName)。

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

+1

只要实体集合在内存中,您仍然可以按它进行过滤,是否正确? – DDiVita 2011-05-20 11:52:26

+1

是的,你可以使用linq过滤对象 – 2011-05-20 11:54:10

+0

谢谢。不好意思问我。树上的森林问题在我的结尾。 – waa 2011-05-20 14:26:58

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

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

+0

你能举一个这样的例子吗?对其他人有用 – Andrew 2012-03-13 15:50:23