1

我一直在摆弄和尝试多种事情,但我在某个地方出错了。我尝试尽可能简单地使用 AutoMapper。我正在尝试使用 CreateBrandViewModel 创建一个新品牌并将其保存到数据库中。其中一些可能看起来有点果味,但我试图让它以最简单的方式工作。

领域:

public class Brand : EntityBase
{
    public virtual string Name { get; set; } //Not Nullable
    public virtual bool IsActive { get; set; } // Not Nullable
    public virtual Product DefaultProduct { get; set; } // Nullable
    public virtual IList<Product> Products { get; set; } // Nullable
}

视图模型:

public class CreateBrandViewModel
{
    public string Name { get; set; }
    public bool IsActive { get; set; }
}

控制器

这是我玩了一段时间最多的地方,所以现在看起来有点奇怪。注释掉的代码并没有解决我的问题。

    [HttpPost]
    public ActionResult Create(CreateBrandViewModel createBrandViewModel)
    {
        if(ModelState.IsValid)
        {

            Mapper.CreateMap<Brand, CreateBrandViewModel>();
                //.ForMember(
                //    dest => dest.Name,
                //    opt => opt.MapFrom(src => src.Name)
                //)
                //.ForMember(
                //    dest => dest.IsActive,
                //    opt => opt.MapFrom(src => src.IsActive)
                //);

            Mapper.Map<Brand, CreateBrandViewModel>(createBrandViewModel)
            Session.SaveOrUpdate(createBrandViewModel);
            return RedirectToAction("Index");
        }

        else
        {
            return View(createBrandViewModel);
        }
    }

仅作记录,BrandController 继承自 SessionController(Ayendes 方式),事务通过 ActionFilter 进行管理。虽然我认为那有点无关紧要。我尝试了各种不同的方法,所以我有不同的错误消息——如果你能看看发生了什么,并告诉我你可能期望如何使用它,那就太好了。

作为参考,我对 Brand 的流畅的 nhibernate 映射:

public class BrandMap : ClassMap<Brand>
{
    public BrandMap()
    {
        Id(x => x.Id);

        Map(x => x.Name)
            .Not.Nullable()
            .Length(50);

        Map(x => x.IsActive)
            .Not.Nullable();

        References(x => x.DefaultProduct);

        HasMany(x => x.Products);

    }
}

编辑 1

我刚刚尝试了以下代码,但是在 Session.SaveOrUpdate(updatedModel) 上放置了一个断点,这些字段是 null 和 false,而它们不应该是:

            var brand = new Brand();
            var updatedBrand = Mapper.Map<Brand, CreateBrandViewModel>(brand, createBrandViewModel);
            Session.SaveOrUpdate(updatedBrand);
            return RedirectToAction("Index");
        }
4

1 回答 1

2

从邮局回程时,您似乎以错误的方式进行映射。替代语法在这里可能会有所帮助,请尝试:

// setup the viewmodel -> domain model map 
// (this should ideally be done at initialisation time, rather than per request)
Mapper.CreateMap<CreateBrandViewModel, Brand>();
// create our new domain object
var domainModel = new Brand();
// map the domain type to the viewmodel
Mapper.Map(createBrandViewModel, domainModel);
// now saving the correct type to the db
Session.SaveOrUpdate(domainModel);

让我知道这是否会使鸡蛋破裂……或者只是鸡蛋再次出现在您的脸上:-)

于 2012-08-10T11:20:07.477 回答