实体框架4.1代码首先映射/填充来自两个数据库列的单个属性
我知道这个问题已被问到/回答,但我无法为我的生活找到它。实体框架4.1代码首先映射/填充来自两个数据库列的单个属性
我正在创建和ASP.NET MVC 3应用程序与现有的数据库,但要先去代码,所以我用EF电源工具CTP1让我开始。最终,我会重构一个更好的解决方案,但要开始使用MVCScaffolding
创建控制器和视图。我正在努力在我的模型上创建一个显示值(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
映射还是我要对这个完全错误的方式映射文件?
不,不可能创建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
搜索 - 你仍然必须使用FirstName
和LastName
)。
如果您使用新的Power Tools的代码生成功能,您应该根据@Steve Mallory的建议在单独的部分类中声明此属性 - 如果您想重新生成代码,请不要修改生成的代码。
我不会映射数据库中的字段。相反,我会将我的POCO声明为部分。在另一个文件中,我将拥有相同的部分类并在那里定义组合值(只有一个getter)。如果你需要它,我有示例代码。
将它保存在单独的文件中可以帮助您稍后再进行任何代码生成。
你能举一个这样的例子吗?对其他人有用 – Andrew 2012-03-13 15:50:23
只要实体集合在内存中,您仍然可以按它进行过滤,是否正确? – DDiVita 2011-05-20 11:52:26
是的,你可以使用linq过滤对象 – 2011-05-20 11:54:10
谢谢。不好意思问我。树上的森林问题在我的结尾。 – waa 2011-05-20 14:26:58