首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我应该使用从ViewModel到实体框架实体的AutoMapper吗?

我应该使用从ViewModel到实体框架实体的AutoMapper吗?
EN

Stack Overflow用户
提问于 2011-09-29 04:02:03
回答 3查看 18K关注 0票数 22

我目前正在使用AutoMapper将实体框架实体映射到视图模型:

代码语言:javascript
复制
public class ProductsController : Controller
{
    private IProductRepository productRepository;

    public ProductsController(IProductRepository productRepository)
    {
         this.productRepository = productRepository;
    }

    public ActionResult Details(int id)
    {
        var product = productRepository.GetProduct(id);

        if( product == null )
            return View("NotFound");

        ProductDetailsViewModel model = Mapper.Map<Product, ProductDetailsViewModel>(product);

        return View(model);
    }
}

这样做效果很好。我的问题是,为了更新数据库,我何时需要从View Model转到我的实体。我应该为此使用AutoMapper吗?这是一种糟糕/危险的做法吗?

看起来AutoMapper很适合将复杂的类型展平为简单的(平面)类型,但到目前为止,我正在努力从平面/简单类型转换为更复杂的类型,比如我的具有各种导航属性的实体。

如果使用AutoMapper来做这件事不是个好主意,那么我的代码在Create操作中会是什么样子呢?

代码语言:javascript
复制
public ActionResult Create(CreateProductViewModel model)
{
    if( ModelState.IsValid )
    {
        // what do i do here to create my Product entity?
    }
}

编辑操作呢?

代码语言:javascript
复制
public ActionResult Edit(int id, EditProductViewModel model)
{
    Product product = productRepository.GetProduct(id);

    // how do i convert my view model to my entity at this point???
}
EN

回答 3

Stack Overflow用户

发布于 2011-09-29 04:09:51

我使用AutoMapper和一个专门的映射类,该类理解如何从简单的模型创建复杂的模型。AutoMapper用于处理类中的一对一映射和自定义逻辑,以完成更复杂的事情(如关系等)。所有的AutoMapper配置都是在映射类的静态构造函数中完成的,该构造函数还会验证映射配置,以便及早出错。

代码语言:javascript
复制
public class ModelMapper
{
    static ModelMapper()
    {
        Mapper.CreateMap<FooView,Foo>()
              .ForMember( f => f.Bars, opt => opt.Ignore() );

        Mapper.AssertConfigurationIsValid();
    }

    public Foo CreateFromModel( FooView model, IEnumerable<Bar> bars )
    {
         var foo = Mapper.Map<FooView,Foo>();
         foreach (var barId in model.BarIds)
         {
             foo.Bars.Add( bars.Single( b => b.Id == barId ) );
         }
         return foo;
    }
}
票数 12
EN

Stack Overflow用户

发布于 2012-03-15 06:27:59

您还可以尝试将AutoMapper配置为仅映射标量属性(而不是必须对每个您不想要的属性执行.Ignore()操作(包括继承的属性,如.EntityKey.EntityState)。

代码语言:javascript
复制
AutoMapper.Mapper.CreateMap<EntityType, EntityType>()
    .ForAllMembers(o => {
         o.Condition(ctx =>
             {
                 var members = ctx.Parent.SourceType.GetMember(ctx.MemberName); // get the MemberInfo that we are mapping

                if (!members.Any())
                    return false;
                return members.First().GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false).Any(); // determine if the Member has the EdmScalar attribute set
            });
    });

有关更多信息,请访问http://www.prosoftnearshore.com/blog/post/2012/03/14/Using-AutoMapper-to-update-Entity-Framework-properties.aspx

票数 2
EN

Stack Overflow用户

发布于 2015-12-03 06:22:10

本质上自动映射是不好的,我在这个http://blog.gavryli.uk/2015/12/02/why-automapping-is-bad-for-you/上写了一篇博客文章

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7588907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档