Automapper EF Core выдает «Значение не может быть нулевым. Имя параметра: querySource» для навигации Свойства - PullRequest
0 голосов
/ 12 октября 2018

Я получаю Value cannot be null. Parameter name: querySource ошибку от Automapper при сопоставлении свойств навигации.

.ForMember(p => p.Region, opt => opt.MapFrom(p => 
  (p.RegAddressId.HasValue && p.RegAddress.CountryId.HasValue)? 
  p.RegAddress.Country.Region: p.Nationality.Region)) 

RegAddressId имеет значение Nullable, а NationalityId не имеет значение NULL.

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.Я поднял проблему и обновлю вопрос, как только он будет исправлен.Если кто-то ищет обходной путь, это то, что я получил от команды EF Core.

Обходной путь (при отсутствии автоматического сопоставления) не будет использовать нулевую проверку при навигации.EF Core уже делает это для вас.Просто убедитесь, что приведете к типу nullable в конце.В EFCore, если вы напишите dtoUser.RegAddress.Country.Region.Id, он даст вам ноль, если какая-либо навигация будет нулевой, иначе даст вам значение связанного идентификатора.

...