ASP.net MVC -我应该使用AutoMapper从视图模型到实体框架实体吗?

本文关键字:实体 视图 模型 框架 AutoMapper MVC net 我应该 ASP | 更新日期: 2023-09-27 18:10:03

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

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);
    }
}

这个效果很好。我的问题是,当我需要从我的视图模型到我的实体,以更新数据库。我应该使用AutoMapper吗?这是一个坏的/危险的做法吗?

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

如果使用AutoMapper来做这个是一个坏主意,那么我的代码看起来像一个创建操作吗?

public ActionResult Create(CreateProductViewModel model)
{
    if( ModelState.IsValid )
    {
        // what do i do here to create my Product entity?
    }
}

编辑动作呢?

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???
}

ASP.net MVC -我应该使用AutoMapper从视图模型到实体框架实体吗?

我的心态是更新你的实体是一件相当大的事情,不应该使用自动化工具。手动设置属性

是的,这是一个非常小的代码量,但自动执行或运行数据库实体上的updatemodel有时会产生意想不到的后果。最好确保写操作正确。

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

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;
    }
}

你也可以尝试配置AutoMapper只映射标量属性(而不是必须映射到.Ignore()的每一个属性,你不希望它(包括继承属性,如.EntityKey.EntityState)。

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

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