Model 使用Automapper将大型域模型映射到数据库对象

Model 使用Automapper将大型域模型映射到数据库对象,model,mapping,automapper,cyclomatic-complexity,Model,Mapping,Automapper,Cyclomatic Complexity,我想使用Automapper将我的模型对象映射到数据库对象。假设数据库对象超过30个字段,我希望映射模型中20个属性中的10个。为了使它更复杂,我需要在更新记录时映射不同的属性,而不是在向数据库插入新记录时映射不同的属性 我使用的解决方案是创建两个通用类Insert和Update以及指定这两个映射的映射配置文件 下面是一个例子: public abstract class SyncMappingWrapper<TFrom> where TFrom : class { prot

我想使用Automapper将我的模型对象映射到数据库对象。假设数据库对象超过30个字段,我希望映射模型中20个属性中的10个。为了使它更复杂,我需要在更新记录时映射不同的属性,而不是在向数据库插入新记录时映射不同的属性

我使用的解决方案是创建两个通用类Insert和Update以及指定这两个映射的映射配置文件

下面是一个例子:

public abstract class SyncMappingWrapper<TFrom> where TFrom : class
{
    protected SyncMappingWrapper(TFrom model)
    {
        Model = model;
    }

    public TFrom Model { get; private set; }
}

public class Update<TFrom> : SyncMappingWrapper<TFrom> where TFrom : class
{
    public Update(TFrom model)
        : base(model)
    {
    }
}

public class Insert<TFrom> : SyncMappingWrapper<TFrom> where TFrom : class
{
    public Insert(TFrom model)
        : base(model)
    {
    }
}

我希望避免使用DynamicMap()来完全控制映射(因此我不会错误地映射随机属性)。我的目标是解决圈复杂度问题。请不要建议ValueInjector或任何其他方法。我正在AutoMapper内部寻找解决方案。

五年后,但这里有一个建议,可以降低映射复杂性问题。您可以创建一个扩展,以帮助您首先忽略所有成员:

public static class AutoMapperExtension {
    public static IMappingExpression<TSource, TDest> IgnoreAllMembers<TSource, TDest>(this IMappingExpression<TSource, TDest> expression) {
        expression.ForAllMembers(opt => opt.Ignore());
        return expression;
    }
}
公共静态类扩展{
公共静态IMappingExpression IgnoreAllMembers(此IMappingExpression表达式){
expression.ForAllMembers(opt=>opt.Ignore());
返回表达式;
}
}
然后使用它仅定义要执行的映射:

Mapper.CreateMap<Insert<OracleModel>, LiveModel>()
      .IgnoreAllMembers()
      .ForMember(d => d.BaseUnit, o => o.MapFrom(s => s.Model.UOM.BaseUOM.PerSalesUnit))
      /* Mapping for other members here. */;
Mapper.CreateMap()
.IgnoreAllMembers()
.ForMember(d=>d.BaseUnit,o=>o.MapFrom(s=>s.Model.UOM.BaseUOM.PerSalesUnit))
/*此处其他成员的映射。*/;

你有没有找到解决这个问题的方法?我也在做同样的任务:/n不,我简化了我的模型。然而,我相信蒂亚戈·萨伊的答案应该适用于当前版本的AutoMapper。
        Mapper.Map(update, existingRecord);
public static class AutoMapperExtension {
    public static IMappingExpression<TSource, TDest> IgnoreAllMembers<TSource, TDest>(this IMappingExpression<TSource, TDest> expression) {
        expression.ForAllMembers(opt => opt.Ignore());
        return expression;
    }
}
Mapper.CreateMap<Insert<OracleModel>, LiveModel>()
      .IgnoreAllMembers()
      .ForMember(d => d.BaseUnit, o => o.MapFrom(s => s.Model.UOM.BaseUOM.PerSalesUnit))
      /* Mapping for other members here. */;