5派生类不能访问部分类的属性

本文关键字:分类 属性 访问部 不能 派生 | 更新日期: 2023-09-27 17:54:11

我有一个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是空的,导致FullName只是返回空白,应该分隔FirstName和LastName属性,即

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

但请注意,如果我这样做:

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

它工作,所以FirstName和LastName不是空的。关于为什么FullName没有被正确返回的任何想法?一般来说,处理多个版本的UserProfile的最佳方法是什么?

5派生类不能访问部分类的属性

不确定这是您的问题,但您的部分类扩展了IEntity public partial class UserProfile : IEntity,其中auto-gen类没有。我相信这些应该完全匹配,或者c#允许你这样做吗?

UPDATE我相信你的问题是你正在尝试在你的linq查询中使用派生/计算属性,当你考虑使用EF将其映射回你的数据库时,它将无法处理/翻译。下面的讨论似乎是相关的:在LINQ语句

中使用分部类属性