2013-01-16 104 views
2

我有一個EF 5/MVC 4,我正在開發的數據庫第一個項目,併爲我的應用程序的某些邏輯功能區創建了單獨的edmx文件(UserManagement,CompanyManagement,InventoryManagement , 訂單管理)。 UserProfile表位於所有edmx文件中,因爲它可以加入到CreatedById和ModifiedById表中,因此您可以獲取實際的用戶名。但我不想在每個版本的UserProfile表中創建額外的屬性和數據註釋,所以我繼承了我所稱的UserProfile的「原始版本」,該UserProfile位於UserManagement區域,我添加了其他屬性並添加了我的數據註釋。好的,還在我身邊?EF 5派生類不能訪問部分類的屬性

好了,所以這裏是原來的用戶配置類EF 5創建(在UserManagement面積/文件夾):

namespace OTIS.domain.UserMgmt 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class UserProfile 
    { 
     public UserProfile() 
     { 
      this.webpages_Roles = new HashSet<webpages_Roles>(); 
     } 

     public int UserId { get; set; } 
     public Nullable<int> AccountId { get; set; } 
     public string UserName { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 

     public virtual webpages_Membership webpages_Membership { get; set; } 
     public virtual ICollection<webpages_Roles> webpages_Roles { get; set; } 
    } 
} 

這是我的部分類我使用添加額外的屬性,並添加數據的註釋:

namespace OTIS.domain.UserMgmt 
{ 
    [MetadataType(typeof(UserProfileMD))] 
    public partial class UserProfile : IEntity 
    { 
     public int Id 
     { 
      get 
      { 
       return this.UserId; 
      } 
     } 

     public string FullName 
     { 
      get 
      { 
       return this.FirstName + " " + this.LastName; 
      } 
     } 

     public string EntityDescription 
     { 
      get 
      { 
       return this.FullName; 
      } 
     } 

     public class UserProfileMD 
     { 
      public int UserId { get; set; } 

      [Required] 
      [Display(Name = "User Name")] 
      public string UserName { get; set; } 

      [Required] 
      [Display(Name = "First Name")] 
      public string FirstName { get; set; } 

      [Required] 
      [Display(Name = "Last Name")] 
      public string LastName { get; set; } 

      [Display(Name = "Name")] 
      public string FullName { get; set; } 

      [Display(Name = "Email")] 
      public string Email { get; set; } 

     } 
    } 
} 

現在我有一個版本的用戶配置的是在InventoryMgmt EDMX工作,所以我創建了一個局部類同名,並從上面繼承:

namespace OTIS.domain.InventoryMgmt 
{ 
    [MetadataType(typeof(OTIS.domain.UserMgmt.UserProfile.UserProfileMD))] 
    public partial class UserProfileInvnMgmt : UserProfile 
    { 

    } 
} 

現在還在InventoryMgmt edmx中是PO標題。這裏是(這是外鍵表CreatedById注意它引用UserProfileInvnMgmt用戶配置)的EF生成的類:

namespace OTIS.domain.InventoryMgmt 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class POHeader 
    { 
     public POHeader() 
     { 
      this.PODetails = new HashSet<PODetail>(); 
     } 

     public int Id { get; set; } 
     public int FacilityId { get; set; } 
     public int VendorId { get; set; } 
     public int StatusId { get; set; } 
     public string Notes { get; set; } 
     public int CreatedById { get; set; } 
     public System.DateTime CreatedOn { get; set; } 
     public int ModifiedById { get; set; } 
     public System.DateTime ModifiedOn { get; set; } 

     public virtual ICollection<PODetail> PODetails { get; set; } 
     public virtual Vendor Vendor { get; set; } 
     public virtual POHeaderStatus POHeaderStatus { get; set; } 
     public virtual UserProfileInvnMgmt UserProfile { get; set; } 
     public virtual UserProfileInvnMgmt UserProfile1 { get; set; } 
    } 
} 

現在我有一個POHeader類實體轉換爲視圖模型的方法。在設計時,它允許我將POHeader.UserProfile.FullName分配給視圖模型屬性OrderedBy。

public IEnumerable<POHeadersListViewModel> ConvertClassToViewModel(IEnumerable<POHeader> purchaseOrders) 
    { 
     IEnumerable<POHeadersListViewModel> poGrid = 
      from l in purchaseOrders.ToList() 
      select new POHeadersListViewModel() 
      { 
       Id = l.Id, 
       VendorName = l.Vendor.VendorName, 
       OrderedBy = l.UserProfile.FullName, 
       OrderDate = l.CreatedOn, 
       Status = l.POHeaderStatus.DisplayName 
       //OwnerName = l.Customer == null ? "" : l.Customer.CustomerName 
      }; 

     return poGrid; 
    } 

但是,當你運行該代碼,沒有價值被分配到OrderedBy,如果,在調試時,擴展出了IEnumerable purchaseOrders中的變量,你看到的用戶配置,但如果你展開它了,你看不到FullName屬性,但名字和姓氏被填充。視圖模型中的結果值或OrderBy是單個空間,看起來好像返回FullName屬性,但FirstName和LastName爲null,導致FullName僅返回應該分隔FirstName和LastName屬性的空白區域,即

public string FullName 
    { 
     get 
     { 
      return this.FirstName + " " + this.LastName; 
     } 
    } 

但要注意的是,如果我這樣做:

OrderedBy = l.UserProfile.FirstName + " " + l.UserProfile.LastName, 

它的工作原理,所以名字和姓氏不爲空。關於爲什麼FullName不能正確返回的任何想法?一般來說,處理多個版本的UserProfile是最好的方法嗎?

回答

0

不確定這是你的問題,但你的部分類擴展IEntity public partial class UserProfile : IEntity自動發電類沒有。我相信這些應該完全匹配,或者C#允許你這樣做嗎?

UPDATE我相信你的問題是,你試圖使用你的LINQ查詢,導出/計算的屬性,當你考慮映射這回使用EF會不會有事您的數據庫將能夠處理/翻譯。這個討論似乎相關:Using a partial class property inside LINQ statement

+0

感謝您的迴應。看起來像C#允許的。 IEntity接口可以在代碼的其他部分正常工作。此外,Auto Gen代碼沒有辦法將其放入。所以必須有其他原因。 –

+0

你有沒有嘗試設置一個斷點,並通過這個來看看發生了什麼?此外,感謝您的更新。 – Matthew

+0

是的,看到上面以「然而,當你運行這個代碼......」開始的部分...... –