为什么实体框架有时不包含导航属性?

时间:2018-09-04 23:03:47

标签: c# asp.net-mvc entity-framework entity-framework-6 asp.net-identity

我目前正在使用EF6帮助开发Web应用程序以进行数据管理。

重要说明... 启用了延迟加载,实际上没有将其设置为的可能(它在较早的时间就已引入应用程序中。 。从存储库收到的返回实体在Automapper(7.0.1)的帮助下映射到视图模型,然后传递到视图中。由于我使用的是Automapper,因此我找到了最佳的选择,以确保我在源中的属性将可用,即使用Eager-loading –使用Include()方法。因此,我混用了这两种逻辑-尽可能快地加载,其余则使用延迟加载。

  

那是什么问题?

     

有时我的导航属性未正确加载,并且在我的   给定视图模型,我的属性为null。它是随机发生的。 但是,   如果我开始调试(只需在某处插入断点),则属性将正确显示。是吗   EF6背后隐藏着什么神秘的东西?可能有问题吗   自动映射器?每次提及都会有所帮助。


映射的实体UserEmailMessage,其中包括导航属性:RecipientUser和自引用属性ReplyUserEmailMessage

 public class UserEmailMessage
    {
        //abbreviated for clarity
        public int UserEmailMessageId{ get; set; }
        public virtual User Recipient { get; set; }
        public virtual User Sender { get; set; }
        public virtual UserEmailMessage ReplyUserEmailMessage { get; set; }
    }

实体User继承自IdentityUser,因为我正在使用ASP.NET Identity进行会员管理。

public class User : IdentityUser<long, MyLogin, MyUserRole, MyClaim>
{
    //abbreviated for clarity
    public virtual List<UserEmailMessage> UserMessages { get; set; }
}

从我的存储库中查询数据

public UserEmailMessage TestEmailMessage(Expression<Func<UserEmailMessage, bool>> predicate)
        {
            return context.UserEmails.Where(predicate)
                .Include(p => p.Recipient).Include(p => p.Sender).Include(p => p.ReplyUserEmailMessage)
                .FirstOrDefault();
        }

具有给定Automapper配置文件的映射实体

     public class EntityProfile : Profile
        {
            public EntityProfile()
            {
                CreateMap<UserEmailMessage, EmailMessageViewModel>()
                    .ForMember(dest => dest.RecipientId, source => source.MapFrom(sc => sc.Recipient.Id))
                    .ForMember(dest => dest.SenderEmail, source => source.MapFrom(sc => sc.Sender.Email))
                    .ForMember(dest => dest.SenderFirstName, source => source.MapFrom(sc => sc.Sender.FirstName))
                    .ForMember(dest => dest.SenderLastName, source => source.MapFrom(sc => sc.Sender.LastName))
                    .ForMember(dest => dest.RecipientEmail, source => source.MapFrom(sc => sc.Recipient.Email));
            }
        }

正如我之前提到的,结果有时不包括导航属性。 但是,通过断点和调试,结果总是可以正确显示。

有时,我在视图中(在使用视图模型时)会得到这种不良结果。我用空词 empty 替换空结果。错误结果中仅包含RecipientId

//@Model.EmailMessageViewModel.RecipientId
RecipientId:182                         
//@Model.EmailMessageViewModel.SenderEmail                 
SenderEmail: empty
//@Model.EmailMessageViewModel.SenderFirstName      
SenderFirstName:empty
//@Model.EmailMessageViewModel.SenderLastName  
SenderLastName:empty
//@Model.EmailMessageViewModel.RecipientEmail
RecipientEmail:empty

0 个答案:

没有答案