簡體   English   中英

EF 5派生類無法訪問部分類的屬性

[英]EF 5 derived classes can't access partial class's property

我有一個EF 5 / MVC 4數據庫優先項目,正在為我的應用程序的某些邏輯功能區域(UserManagement,CompanyManagement,InventoryManagement,OrderManagement)創建單獨的edmx文件。 UserProfile表位於所有edmx文件中,因為該文件可以連接到CreatedById和ModifiedById表,因此您可以獲取實際的用戶名。 但是我不想在每個版本的UserProfile表中創建其他屬性和數據注釋,因此我繼承了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 Header。 這是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的最佳方法是什么?

不確定這是否是您的問題,但是您的局部類擴展了IEntity public partial class UserProfile : IEntity ,而自動生成類卻沒有。 我相信這些應該完全匹配,還是C#允許您這樣做?

更新,我相信您的問題是,您正在嘗試在linq查詢中使用派生/計算的屬性,當您考慮使用EF將其映射回數據庫時,它將無法處理/轉換。 討論似乎很相關: 在LINQ語句中使用局部類屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM