我有一個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是最好的方法嗎?
感謝您的迴應。看起來像C#允許的。 IEntity接口可以在代碼的其他部分正常工作。此外,Auto Gen代碼沒有辦法將其放入。所以必須有其他原因。 –
你有沒有嘗試設置一個斷點,並通過這個來看看發生了什麼?此外,感謝您的更新。 – Matthew
是的,看到上面以「然而,當你運行這個代碼......」開始的部分...... –