Нестандартное отображение наследования с AutoMapper - PullRequest
1 голос
/ 21 ноября 2011

У меня есть «наследование таблиц» в моей БД (где ссылка на базу потомков с внешним ключом), и я использую Linq To Sql в качестве моего DAL:

[Table]
class Document {
    [Column]public int ID { get; set; }
    [Column]public int DocTypeID { get; set; }
    [Association]public Application Application { get; set; }
}

[Table]
class Application {
    [Column]public int ID { get; set; }
    [Column]public string AppType { get; set; }
    [Association]public Document Document {get;set}
}

Поскольку L2S не поддерживает наследование нескольких таблиц Application не наследуется от Document.Тем не менее, в моих классах сущностей я хочу наследование:

class DocumentBase {
    public int ID { get; set; }
    public int DocTypeID { get; set; }
}

class MyApplication : DocumentBase {
    public string AppType { get; set; }
}

Теперь я создаю сопоставления:

Mapper.CreateMap<Document, DocumentBase>();
Mapper.CreateMap<Application, MyApplication>();

Но AutoMapper жалуется на базовые свойства в MyApplication, которые не сопоставлены.Я не хочу дублировать базовые свойства на карте MyApplication (слишком много потомков от DocumentBase).Я нашел несколько постов, предлагающих пользовательский ITypeConverter, но не понимаю, как применить его к моему сценарию.Что мне делать?

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

Проблема в том, что DocTypeId не отображается. Попробуйте это

    Mapper.CreateMap<Document, DocumentBase>();
    Mapper.CreateMap<Application, MyApplication>()
          .ForMember(d => d.DocTypeId, opt => opt.MapFrom(s => s.Document.ID);

Отредактировано после комментария:

Вы можете вызвать базовый маппер, как это

Mapper.CreateMap<Document, DocumentBase>();
    Mapper.CreateMap<Application, MyApplication>()
    .AfterMap((app, myApp) => Map<Document, DocumentBase>(app.Document, myApp);
1 голос
/ 22 ноября 2011

Нашел это решение , которое также страдает от AssertConfigurationIsValid() жалобы на базовые свойства, которые не отображены, но немного изменили его:

static void InheritMappingFromBaseType<S, D>(this IMappingExpression<S, D> mappingExpression)
    where S: Document
    where D: DocumentBase
{
    mappingExpression // add any other props of Document
        .ForMember(d => d.DocTypeId, opt => opt.MapFrom(s => s.Document.DocTypeId);
}

Теперь оно может быть приковано к каждому DocumentBase потомкукарта:

Mapper.CreateMap<Application, MyApplication>()
    .InheritMappingFromBaseType();

и AssertConfigurationIsValid() счастлив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...