2017-01-18 8 views
0

Учитывая следующее:Использование AutoMapper с EF Code First присоединяется во время совместного отображения

public class Foo 
{ 
    public Int32 Foo_PK { get; set; } 
    public String SomeProperty { get; set; } 
} 
public class Bar 
{ 
    public Int32 Bar_PK { get; set; } 
    public Int32 Foo_FK { get; set; } 
    public String SomeOtherProperty { get; set; } 
} 
public class JoinResult<TEntity, TJoiningEntity> 
{ 
    public TEntity From { get; private set; } 
    public TEntity To { get; private set; } 
    public JoinResult(TEntity from, TEntity to) 
    { 
     this.From = from; 
     this.To = to; 
    } 
} 
public interface IFooResult 
{ 
    public String SomeProperty { get; set; } 
} 
public interface IBarResult : IFooResult 
{ 
    public String SomeOtherProperty { get; set; } 
} 
public class FooResultDTO : IFooResult, IBarResult 
{ 
    public String SomeProperty { get; set; } 
    public String SomeOtherProperty { get; set; } 
} 

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

public class FooDispensary 
{ 
    public IQueryable<T> Dispense<T>() 
    where T: IFooResult 
    { 
     using (var repository = new Repository()) 
     { 
      // TODO: Handle mapping for Foo -> FooResult 

      // Project to 
      return repository.Foos.ProjectTo<FooResultDTO>(); 
     } 
    } 
    public IQueryable<T> DispenseWithBars<T>() 
    where T : IFooResult, IBarResult 
    { 
     using (var repository = new Repository()) 
     { 
      // TODO: Handle mapping for JoinResult.From (same as Foo -> FooResult) as well as to JoinResult.To 

      // Project to 
      return repository.Foos.Join((f) => f.Foo_PK, 
             (b) => b.Foo_FK, 
             (f, b) => new JoinResult<Foo, Bar>(f, b)) 
            .ProjectTo<FooResultDTO>(); 
     } 
    } 
} 

Однако, я бы в идеале, как только указать базовое отображение раз (Foo -> IFooResult), а затем повторно использовать это в методах, где мы должны присоединиться к дочерней таблице.

Существует несколько причин, требующих сделать это, которые являются специфическими для моего проекта, но не нужно вдаваться в них, мне просто интересно, возможно ли это, поскольку я боролся с синтаксисом до сих пор?

Благодаря

ответ

0

Создание карты между Foo и FooResult. Поскольку свойство SomeProperty названо одинаковым как в исходном, так и в целевом Automapper, он сможет определить отображение неявно.

// TODO: Handle mapping for Foo -> FooResult 
AutoMapper.Mapper.CreateMap<Foo, FooResult>(); 

Затем создать карту между JoinResult<Foo, Bar> и FooResultDTO

// TODO: Handle mapping for JoinResult.From (same as Foo -> FooResult) as well as to JoinResult.To 
AutoMapper.Mapper.CreateMap<JoinResult<Foo, Bar>, FooResultDTO>() 
    .ForMember(r => r.SomeProperty, opt => opt.MapFrom(f => f.From.SomeProperty) 
    .ForMember(r => r.SomeOtherProperty, opt => opt.MapFrom(f => f.To.SomeOtherProperty) 

Однако, я бы в идеале, как только указать базовое отображение раз (Foo -> IFooResult), а затем повторно использовать это в методы, в которых нам нужно присоединиться к дочерней таблице.

Вы не resusing отображения между Foo и IFooResult где-нибудь в вашем примере. Ваша вторая функция должна отображаться между JoinResult<Foo, Bar> и FooResultDTO, как показано выше. Если вам нужно повторно использовать сопоставления, я предлагаю вам изучить профиль AutoMapper и управлять однопользовательским экземпляром AutoMapper, который может использоваться совместно между вашими функциями: https://github.com/AutoMapper/AutoMapper/wiki/Configuration

+0

Спасибо за ответ, я хочу сказать, что хотя я сопоставляю * с * JoinResult 'отображение между Foo (' (r) => r.From') и 'IFooResult' останется неизменным, поэтому я хотел бы повторно использовать это, если смогу. Имейте в виду, что приведенное выше является лишь простым примером для того, чтобы сохранить вопрос таким образом, что его легко понять, в базовом классе могут быть 10 свойств, все из которых отображаются в разных местах. – LukeHennerley

+0

@ LukeHennerley Я понимаю, о чем вы просите, но я не уверен, что это возможно из-за использования 'JoinResult <>'. Одна из возможностей, которую вы можете попробовать, - сначала вытащить обратно Foo, проецируя их в DTO, а затем запросить бары и проецировать их в DTO. Это позволит вам повторно использовать сопоставления, определенные ранее, но, очевидно, за счет эффективности запросов. – chambo

+0

@ LukeHennerley Извините, я не могу больше помочь. Я поставил бы вопрос на форуме Automapper. Вы можете получить лучший ответ: https://groups.google.com/forum/#!forum/automapper-users – chambo

 Смежные вопросы

  • Нет связанных вопросов^_^