Automapper возвращает счетчик 0 из списка карты? - PullRequest
0 голосов
/ 14 декабря 2011

, поэтому я нашел несколько вопросов по SO (например: Список отображения Automapper становится равным 0 ) по поводу того, что autopper возвращает список 0 из отображения, но ни один из них не выглядит так, как я смотрю.

У меня есть два типа:

public class DNSContract : BaseContract
{
    public int DoNotSolicitID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public string Zip4 { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string BusinessName { get; set; }
    public string Partner { get; set; }
    public string Origination { get; set; }
}

и

public DNS_Entity()
    {
        // set default values which can be expicity set if needed
        InsertDT = DateTime.Now;
        InsertDT = DateTime.Now;
       // InsertUserID = 999;
        Origination = "RDI";
    }

    public long DoNotSolicitID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public string Zip4 { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string BusinessName { get; set; }
    public string Partner { get; set; }
    public string Origination { get; set; }
    public Nullable<System.DateTime> InsertDT { get; set; }
    //public int InsertUserID { get; set; }
    public DateTime? UpdateDT { get; set; }
    //public int UpdateUserID { get; set; }
}

там довольно легко.Вот метод «быстрой карты», который я использую:

 public static TToType QuickMap<TFromType, TToType>(this TFromType fromObject, TToType toObject)
        where TFromType : class
        where TToType : class, new()
    {
        // Look for an existing map, and if none is found add one.
        if (Mapper.FindTypeMapFor(typeof (TFromType), typeof (TToType)) == null)
        {
            Mapper.CreateMap(typeof (TFromType), typeof (TToType));
        }

        // Execute the auto map
        TToType map = Mapper.Map(fromObject, toObject);

        return map;
    }

пока все хорошо, я думаю.Однако

TToType map = Mapper.Map(fromObject, toObject);

ничего не делает.Проблема в том, что этот код возвращает пустой DNSContract, когда он должен вернуть 4 (из моего модульного теста):

 using (var scope = dnsWork)
        {
            scope.Register(this);

            var one = WhereInternal(whereClause);
            var two = one.ToList();
            var three = two.QuickMap(new List<DNSContract>());
            return three;
            //return WhereInternal(whereClause).ToList().QuickMap(new List<DNSContract>());
        }

Я разбил вызов на один, два, три для здравомыслия во время отладки этого,В общем, у меня есть список, и я хочу вернуть список, и это не удается.

Что-то работает:

return Mapper.Map(two, new List<DNSContract>());

, но я хотел бы использовать универсальный метод, а неотображение разбросано по слоям обслуживания.

С помощью autompper нужно ли делать что-то особенное для отображения списков?Я думаю, что это проблема с отображением типов, но по какой-то причине список для typeB просто не работает правильно.

Спасибо.Это раздражало меня уже пару недель, и я как бы игнорировал это, но мне нужно исправить это как можно скорее.

UPDATE # 1 : согласно запросу ниже приведен метод WhereInternal вфрагмент этого класса, который находится в моем DAL и взят из Entity Framework:

 public abstract class EFRepository<T> : IRepository<T> where T : BaseEntity
{
    public IUnitOfWork UnitOfWork { get; set; }

    private IDbSet<T> _objectset;

    private IDbSet<T> ObjectSet
    {
        get { return _objectset ?? (_objectset = UnitOfWork.Context.Set<T>()); }
    }

    public IQueryable<T> WhereInternal(Expression<Func<T, bool>> expression)
    {
        return ObjectSet.Where(expression);
    }
}

Я не думаю, что это действительно важно в контексте, так как я преобразую в список, а затем пытаюсь отобразить.

1 Ответ

2 голосов
/ 14 декабря 2011

Во-первых, в вашей реализации метода QuickMap есть проблема - я не уверен, зачем вам вообще нужен второй аргумент, если вам действительно нужен тип . Вы также вызываете не самые простые методы для выполнения сопоставлений.

Во-вторых, согласно документации , зарегистрируйте сопоставление только для простых типов , поэтому я бы разделил регистрацию и сопоставление самостоятельно. Вот что я придумал:

static class MapperHelper
{    
    static void Register<TSource, TDestination>()
    {
        var mapped = Mapper.FindTypeMapFor(typeof(TSource), typeof(TDestination));
        if (mapped == null)
        {
            var expression = Mapper.CreateMap<TSource, TDestination>();
        }
    }
    static TDestination QuickMap<TSource, TDestination>(this TSource source)
    {
         return Mapper.Map<TSource, TDestination>(source);
    }
}

И использование:

//Registration
MapperHelper.Register<DNS_Entity, DNSContract>();
//Mapping
var result = WhereInternal(whereClause).ToList().QuickMap<IList<DNS_Entity>, IList<DNSContract>>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...