映射导航属性时,我从Automapper中收到Value cannot be null. Parameter name: querySource
错误。
.ForMember(p => p.Region, opt => opt.MapFrom(p =>
(p.RegAddressId.HasValue && p.RegAddress.CountryId.HasValue)?
p.RegAddress.Country.Region: p.Nationality.Region))
RegAddressId可为空,NationalityId不可为空。
public class User : IEntity
{
...
public int NationalityId { get; set; }
public int? RegAddressId { get; set; }
public virtual LkupNationality Nationality { get; set; }
public virtual Address RegAddress { get; set; }
}
我正在使用Automapper版本为7.0.1和EF Core 2.0.3
以下是从中获得的表达式
var expression = pendingRegs.ProjectTo<PendingClientModel>().Expression;
Region = .If (.If (
($dtoUserRegistration.RegAddressId).HasValue && (($dtoUserRegistration.RegAddress).CountryId).HasValue && $dtoUserRegistration.RegAddress !=
null && ($dtoUserRegistration.RegAddress).Country != null
) {
(($dtoUserRegistration.RegAddress).Country).Region
} .Else {
($dtoUserRegistration.Nationality).Region
} == null) {
null
} .Else {
.New Cft.Fbo.Domain.ViewModels.ListItemModel(){
Desc = (.If (
($dtoUserRegistration.RegAddressId).HasValue && (($dtoUserRegistration.RegAddress).CountryId).HasValue && $dtoUserRegistration.RegAddress !=
null && ($dtoUserRegistration.RegAddress).Country != null
) {
(($dtoUserRegistration.RegAddress).Country).Region
} .Else {
($dtoUserRegistration.Nationality).Region
}).Name,
Id = (.If (
($dtoUserRegistration.RegAddressId).HasValue && (($dtoUserRegistration.RegAddress).CountryId).HasValue && $dtoUserRegistration.RegAddress !=
null && ($dtoUserRegistration.RegAddress).Country != null
) {
(($dtoUserRegistration.RegAddress).Country).Region
} .Else {
($dtoUserRegistration.Nationality).Region
}).Id
}
},
更新:这是由于EF Core中的错误所致。我提出了一个issue,并将在问题解决后对其进行更新。如果有人在寻找解决方法,这就是我从EF Core团队得到的。
解决方法(在没有自动映射器的情况下)将不使用null 检查导航。 EF Core已经为您做到了。只要确保 最后强制转换为可空类型。在EFCore中,如果您编写 dtoUser.RegAddress.Country.Region.Id,如果有的话,它将为您提供null navigation为null,否则为您提供关联ID的值。