我目前正在使用EF6帮助开发Web应用程序以进行数据管理。
重要说明... 启用了延迟加载,实际上没有将其设置为的可能(它在较早的时间就已引入应用程序中。 。从存储库收到的返回实体在Automapper(7.0.1)的帮助下映射到视图模型,然后传递到视图中。由于我使用的是Automapper,因此我找到了最佳的选择,以确保我在源中的属性将可用,即使用Eager-loading –使用Include()
方法。因此,我混用了这两种逻辑-尽可能快地加载,其余则使用延迟加载。
那是什么问题?
有时我的导航属性未正确加载,并且在我的 给定视图模型,我的属性为null。它是随机发生的。 但是, 如果我开始调试(只需在某处插入断点),则属性将正确显示。是吗 EF6背后隐藏着什么神秘的东西?可能有问题吗 自动映射器?每次提及都会有所帮助。
映射的实体UserEmailMessage
,其中包括导航属性:Recipient
,User
和自引用属性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