2011-05-19 24 views
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映射還是我要對這個完全錯誤的方式映射文件?

回答

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到實體查詢中使用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

1

我不會映射數據庫中的字段。相反,我會將我的POCO聲明爲部分。在另一個文件中,我將擁有相同的部分類並在那裏定義組合值(只有一個getter)。如果你需要它,我有示例代碼。

將它保存在單獨的文件中可以幫助您稍後再進行任何代碼生成。

+0

你能舉一個這樣的例子嗎?對其他人有用 – Andrew 2012-03-13 15:50:23

相關問題