将ViewModel数据保存到ASP.NET MVC中的数据库

问题描述:

我是ASP.net MVC的新手,我使用viewmodel而不是viewbags来填充我的下拉列表,因为我见过大多数人推荐他们。我有一个可以级联下拉和自动完成的精巧的UI(这里没有显示),但我似乎无法将我的数据保存回数据库。将ViewModel数据保存到ASP.NET MVC中的数据库

型号:

public partial class Car 
    { 
     public int CarID { get; set; } 
     public string CarName { get; set; } 
     public int ModelID { get; set; } 
     public int ManufacturerID { get; set; } 
     public int CarColorID { get; set; } 
     public Nullable<decimal> Price { get; set; } 
     public string Description { get; set; } 

     public virtual CarColor CarColor { get; set; } 
     public virtual Manufacturer Manufacturer { get; set; } 
     public virtual CarModel CarModel { get; set; } 
    } 
    public partial class CarColor 
    { 
     public CarColor() 
     { 
      this.Cars = new HashSet<Car>(); 
     } 

     public int ColorID { get; set; } 
     public string ColorName { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
    } 
    public partial class CarModel 
    { 
     public CarModel() 
     { 
      this.Cars = new HashSet<Car>(); 
     } 

     public int CarModelID { get; set; } 
     public int ManufacturerID { get; set; } 
     public string CarModelName { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
     public virtual Manufacturer Manufacturer { get; set; } 
    } 
    public partial class Manufacturer 
    { 
     public Manufacturer() 
     { 
      this.Cars = new HashSet<Car>(); 
      this.Manufacturer1 = new HashSet<Manufacturer>(); 
      this.CarModels = new HashSet<CarModel>(); 
     } 

     public int ManufacturerID { get; set; } 
     public string ManufacturerName { get; set; } 
     public Nullable<int> ParentID { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
     public virtual ICollection<Manufacturer> Manufacturer1 { get; set; } 
     public virtual Manufacturer Manufacturer2 { get; set; } 
     public virtual ICollection<CarModel> CarModels { get; set; } 
    } 

视图模型:

控制器:

public ActionResult Create() 
     { 
      var model = new AnotherTestViewModel(); 
      using (new CarTestEntities()) 
      { 
       model.CarModels = db.CarModels.ToList().Select(x => new SelectListItem 
       { 
        Value = x.CarModelID.ToString(), 
        Text = x.CarModelName 
       }); 
       model.Manufacturers = db.Manufacturers.ToList().Select(x => new SelectListItem 
       { 
        Value = x.ManufacturerID.ToString(), 
        Text = x.ManufacturerName 
       }); 
       model.CarColors = db.CarColors.ToList().Select(x => new SelectListItem 
       { 
        Value = x.ColorID.ToString(), 
        Text = x.ColorName 
       }); 
      } 
      return View(model); 
     } 

     // 
     // POST: /AnotherTest/Create 

     [HttpPost] 
     public ActionResult Create(AnotherTestViewModel model) 
     { 
       if (ModelState.IsValid) 
       { 
        db.Entry(model).State = EntityState.Modified; 
        db.SaveChanges(); 
        return RedirectToAction("Details", "AnotherTestViewModel", new { id = model.car.CarID }); 
       } 
       return View(); 
     } 

我看到了一些建议使用Automapper因为EntityState.Modified将无法正常工作,但我不知道如何配置它,因为使用下面的代码不起作用。

Mapper.CreateMap<AnotherTestViewModel, Car>(); 
Mapper.CreateMap<Car, AnotherTestViewModel>(); 
var newCar = Mapper.Map<AnotherTestViewModel, Car>(model); 

任何想法?

您的视图模型不应该与数据库进行交互。视图模型只能用于表示层(用户界面) - 因此术语“视图”模型。你应该有另一个与数据库交互的模型(数据模型)。那么你应该有一些类型的服务层来处理你的视图模型和数据模型之间的转换(反之亦然)。您的数据模型是由Entity Framework生成的模型(我假设您正在使用该模型)。要处理数据库的更新,您需要实例化数据上下文,从数据库中获取数据实体,对该实体进行更改,然后在该数据上下文中调用保存更改。数据上下文将跟踪对实体的所有更改,并在调用“保存更改”时对数据库应用必要的更改。 实施例:

public void UpdateCar(CarViewModel viewModel) 
{ 
    using (DataContext context = new DataContext()) 
    { 
     CarEntity dataModel = context.CarEntities.where(x => x.Id == viewModel.Id).First(); 

     dataModel.Name = viewModel.Name; 
     dataModel.Type = viewModel.Type; 

     context.SaveChanges(); 
    } 
} 

在这个例子中,上下文将保持的任何变化“数据模型”轨道。当调用“context.SaveChanges”时,这些更改将自动应用于数据库。

+0

非常感谢!这正是我需要的帮助。 – Jim 2013-05-01 18:57:52

+0

这个“UpdateCar”函数在哪里存在?你在某种“服务层”中说,你能更准确吗?谢谢! – crunchy 2015-06-03 17:29:53

+0

服务实际上不应该知道UI的任何内容。所以这种转换到你的域/数据模型应该在你的控制器中完成。然后,将域/数据模型传递给执行更新的服务层方法。 – RiceRiceBaby 2016-02-23 05:43:08