我有一个EF 5 / MVC 4,我正在处理的数据库第一个项目,并为我的应用程序的某些逻辑功能区域(UserManagement,CompanyManagement,InventoryManagement,OrderManagement)创建了单独的edmx文件。 UserProfile表位于所有edmx文件中,因为它可以连接到CreatedById和ModifiedById表,因此您可以获取实际的用户名。但我不想在每个版本的UserProfile表中创建其他属性和数据注释,所以我继承了(我称之为)UserProfile的“原始版本”,它位于UserManagement区域,我添加了我的附加属性并添加我的数据注释。好的,还在我身边吗?
好的,所以这是EF 5创建的原始UserProfile类(在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中的UserProfile版本,所以我创建了一个同名的部分类,并从上面继承:
namespace OTIS.domain.InventoryMgmt
{
[MetadataType(typeof(OTIS.domain.UserMgmt.UserProfile.UserProfileMD))]
public partial class UserProfileInvnMgmt : UserProfile
{
}
}
现在,在InventoryMgmt中,edmx也是PO标题。这是EF生成的类(注意它引用了UserProfileInvnMgmt UserProfile,它是CreatedById的外键表):
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变量,你会看到UserProfile,但是如果你展开它,你不会看到FullName属性,但是填充FirstName和LastName。视图模型中的结果值或OrderBy是单个空格,似乎返回了FullName属性,但FirstName和LastName为null,导致FullName只返回应该分隔FirstName和LastName属性的空格,即
public string FullName
{
get
{
return this.FirstName + " " + this.LastName;
}
}
但请注意,如果我这样做:
OrderedBy = l.UserProfile.FirstName + " " + l.UserProfile.LastName,
它有效,所以FirstName和LastName不为null。有关为什么不能正确返回FullName的任何想法?一般来说,处理多个版本的UserProfile是最好的方法吗?
答案 0 :(得分:0)
不确定这是你的问题,但你的部分类扩展了IEntity public partial class UserProfile : IEntity
,其中auto-gen类没有。我相信这些应该完全匹配,或者C#允许你这样做吗?
更新我相信你的问题是你正在尝试在你的linq查询中使用derived / calculated属性,当你考虑使用EF将它映射到你的数据库时它不会是它会能够处理/翻译。这个讨论似乎很相关:Using a partial class property inside LINQ statement