标签: automapper

AutoMapper是否支持Linq?

我对使用Lazy加载功能的Linq to SQL非常感兴趣.而在我的项目,我用AutoMapper映射数据库模型域模型(从DB_RoleInfoDO_RoleInfo).在我的存储库代码中如下:

    public DO_RoleInfo SelectByKey(Guid Key)
    {
        return SelectAll().Where(x => x.Id == Key).SingleOrDefault();
    }

    public IQueryable<DO_RoleInfo> SelectAll()
    {
        Mapper.CreateMap<DB_RoleInfo, DO_RoleInfo>();
        return from role in _ctx.DB_RoleInfo
               select Mapper.Map<DB_RoleInfo, DO_RoleInfo>(role);
    }
Run Code Online (Sandbox Code Playgroud)

SelectAll方法运行良好,但是当我调用时SelectByKey,我收到错误:

方法"RealMVC.Data.DO_RoleInfo MapDB_RoleInfo,DO_RoleInfo"无法转换为SQL.

Automapper是否完全不支持Linq?

我尝试了下面的手动映射代码而不是Automapper:

public IQueryable<DO_RoleInfo> SelectAll()
{
    return from role in _ctx.DB_RoleInfo 
    select new DO_RoleInfo 
    {
        Id = role.id,
        name = role.name,
        code = role.code
    };
}
Run Code Online (Sandbox Code Playgroud)

这种方法按照我想要的方式工作.

automapper linq-to-sql

22
推荐指数
2
解决办法
1万
查看次数

C#automapper嵌套集合

我有一个像这样的简单模型:

public class Order{
   public int Id { get; set; }
   ... ...
   public IList<OrderLine> OrderLines { get; set; }
}

public class OrderLine{
   public int Id { get; set; }
   public Order ParentOrder { get; set; }
   ... ...
}
Run Code Online (Sandbox Code Playgroud)

我用Automapper做的是这样的:

    Mapper.CreateMap<Order, OrderDto>();
    Mapper.CreateMap<OrderLine, OrderLineDto>();
    Mapper.AssertConfigurationIsValid();
Run Code Online (Sandbox Code Playgroud)

它抛出一个异常,说:"OrderDto中的OrderLineDtos属性未映射,添加自定义映射......"当我们在Domain和DomainDto中使用自定义语法时,我如何指定OrderDto中的OrderLineDtos集合对应于OrderLines有序吗?

谢谢

c# automapper

21
推荐指数
2
解决办法
1万
查看次数

当属性名称不同时使用Automapper

我们正在使用Codeplex中的AutoMapper,对我来说,目标对象的所有属性都以'Field'结尾,即cityField,源对象只有city.

我可以使用下面的代码来实现,但所有的属性都只是以'Field'为后缀,有20个属性.

.ForMember(dest => dest.cityField, opt => opt.MapFrom(origin => origin.City));
Run Code Online (Sandbox Code Playgroud)

在映射时是否有任何其他方法可以忽略"字段"字,以便它可以在不使用.ForMember()的情况下映射20次?

c# properties automapper

21
推荐指数
1
解决办法
9266
查看次数

DTO形状:扁平,复杂/嵌套,或两者的混合

我有一个MVC2 n层应用程序(DAL,域,服务,MVC Web)使用DDD方法(域驱动设计),具有带存储库的域模型.我的服务层使用请求/响应模式,其中Request和Response对象包含DTO(数据传输对象)以将数据从一个层封送到下一个层,并且映射通过AutoMapper的帮助完成.我的问题是:DTO通常采用什么样的形状?它既可以嵌套/复杂的 DTO,还是严格来说是平面投影?或者可能两者兼而有之?另外,拥有平面DTO与更复杂/嵌套DTO的主要原因是什么?

例如,假设我有一个域,如下所示:

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Company Company { get; set; }
}
public class Company
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有三种不同的方法可以对Response对象进行建模.

选项1 - DRYest选项:

public class GetEmployeeResponse …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc domain-driven-design dto automapper

21
推荐指数
1
解决办法
4738
查看次数

Automapper与依赖注入一起使用

我目前有以下映射:

Mapper.CreateMap<Journal, JournalDto>();
Run Code Online (Sandbox Code Playgroud)

现在,Journal包含一个名为的成员RefTypeID,其对应的值存在于数据库的另一个表中; 为了查找这个值,我有一个处理简单int -> string请求的服务.automapper配置当前发生在程序开头的静态类中.可以将映射代码移动到一个注入我的DI容器的类中,还是有更好的方法?

dependency-injection automapper

21
推荐指数
4
解决办法
2万
查看次数

AutoMapper AssertConfigurationIsValid是否足以确保良好的映射?

我想问你一个关于AutoMapper的问题.我们正在对我们的映射进行单元测试:

var dtoFiltrePersonne = new DtoFiltrePersonne { Prop1 = "Test", Prop2 = 1234 };
Mapper.CreateMap<FiltrePersonne, DtoFiltrePersonne>();
var filtrePersonne = DtoAutoMappeur<DtoFiltrePersonne, FiltrePersonne>.Instance.MapFromDtoToEntity(dtoFiltrePersonne);
Assert.AreEqual(dtoFiltrePersonne.Prop1, filtrePersonne.Prop1);
Assert.AreEqual(dtoFiltrePersonne.Prop2, filtrePersonne.Prop2);
Run Code Online (Sandbox Code Playgroud)

我想知道这个单元测试是否提供相同的覆盖范围?

Mapper.CreateMap<FiltrePersonne, DtoFiltrePersonne>();
AutoMapper.AssertConfigurationIsValid()
Run Code Online (Sandbox Code Playgroud)

我查看了AutoMapper配置文档,对我来说并不是很清楚.我是否需要对每个映射进行单元测试或仅使用该AssertConfigurationIsValid方法?

c# unit-testing automapper

21
推荐指数
1
解决办法
1万
查看次数

AutoMapper.Map忽略源对象的所有Null值属性

我正在尝试映射2个相同类型的对象.我想要做的是AutoMapper to toigonore所有属性,它们Null在源对象中有值,并保留目标对象中的现有值.

我已经尝试在我的"存储库"中使用它,但它似乎不起作用.

Mapper.CreateMap<TEntity, TEntity>().ForAllMembers(p => p.Condition(c => !c.IsSourceValueNull));
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?

.net c# repository automapper

21
推荐指数
2
解决办法
2万
查看次数

发射映射器与valueinjecter或automapper性能

我花了一些时间比较这三个映射器,有趣的是为什么在emitmapper和任何valueinjecter或者automapper之间有如此大的性能差异(最后两个可以通过性能进行比较).来自emitmapper解决方案的基准测试(1000000次迭代):

    Auto Mapper (simple):        38483 milliseconds
    Emit Mapper (simple):        118 milliseconds
    Handwritten Mapper (simple): 37 milliseconds

    Auto Mapper (Nested):        53800 milliseconds
    Emit Mapper (Nested):        130 milliseconds
    Handwritten Mapper (Nested): 128 milliseconds

    Auto Mapper (Custom):        49587 milliseconds
    Emit Mapper (Custom):        231 milliseconds
Run Code Online (Sandbox Code Playgroud)

还有一些来自valueinjecter的基准测试运行了添加的emitmapper(10000次迭代):

    Convention: 00:00:00.5016074
    Automapper: 00:00:00.1992945 
    Smart convention: 00:00:00.2132185
    Emit mapper(each time new mapper): 00:00:00.1168676
    Emit mapper(one mapper): 00:00:00.0012337
Run Code Online (Sandbox Code Playgroud)

首先发射映射器测试 - 每次创建它,第二次 - 所有转换的一个映射器.

考虑到这一点,作为valueinjecter(也作为automapper)的结果比发射映射器的结果慢100倍.如此巨大的性能差异是什么原因?至于我对象,对象映射器与手写映射器相比不能花费那么多时间,因为它是项目的瓶颈(例如,如果我们需要映射对象的集合).

此刻我正在考虑使用emit mapper,但只有一个原因我还没准备好决定:首先开发人员根本不支持发射映射器,但我不确定这是非常重要的(非常低的可能性)要求一些额外的功能).

.net performance automapper emitmapper

21
推荐指数
1
解决办法
9417
查看次数

使用automapper将一个源类映射到多个派生类

假设我有一个源类:

public class Source
{
    //Several properties that can be mapped to DerivedBase and its subclasses
}
Run Code Online (Sandbox Code Playgroud)

还有一些目的地类:

public class DestinationBase
{
     //Several properties
}

public class DestinationDerived1 : DestinationBase
{
     //Several properties
}

public class DestinationDerived2 : DestinationBase
{
     //Several properties
}
Run Code Online (Sandbox Code Playgroud)

然后我希望派生的目标类继承baseclass的automapper配置,因为我不想重复它,有没有办法实现这个?

Mapper.CreateMap<Source, DestinationBase>()
    .ForMember(...)
    // Many more specific configurations that should not have to be repeated for the derived classes
    .ForMember(...);

Mapper.CreateMap<Source, DestinationDerived1 >()
    .ForMember(...);
Mapper.CreateMap<Source, DestinationDerived2 >()
    .ForMember(...);
Run Code Online (Sandbox Code Playgroud)

当我像这样写它时根本不使用基本映射,包含似乎对我没有帮助.

编辑:这是我得到的:

public class Source
{
    public string …
Run Code Online (Sandbox Code Playgroud)

c# automapper automapper-2

21
推荐指数
2
解决办法
2万
查看次数

在ASP.NET Core 1.0 MVC6中使用内置IoC配置AutoMapper 4.2

我试图找出在我的应用程序的Startup.cs文件中配置AutoMapper的正确方法,然后在我的应用程序中使用它.

我正在尝试使用这个文档,它解释了如何在没有旧的静态API的情况下仍然给AutoMapper一个静态的感觉.该示例使用StructureMap.

我想知道如何做类似的事情,但是在使用内置服务容器的Core 1.0应用程序中.

我假设在配置函数中我将配置AutoMapper,然后在ConfigureServices函数中我将其添加为瞬态.

我假设最后最干净,最正确的方法是使用依赖注入.这是我目前的尝试,但它不起作用:

Startup.cs

public IMapper Mapper { get; set; }
private MapperConfiguration MapperConfiguration { get; set; }
public void ConfigureServices(IServiceCollection services)
{
     services.AddTransient<IMapper, Mapper>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    MapperConfiguration MapperConfiguration = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<Product, ProductViewModel>().ReverseMap();
    });

    Mapper = MapperConfiguration.CreateMapper();
}
Run Code Online (Sandbox Code Playgroud)

在我的控制器中:

private IMapper _mapper { get; set; }
// Constructor
public ProductsController(IMapper mapper)
{
    _mapper = mapper;
}

public IActionResult Create(ProductViewModel vm)
{
    Product product = …
Run Code Online (Sandbox Code Playgroud)

c# asp.net automapper asp.net-core-1.0

21
推荐指数
2
解决办法
2万
查看次数