2013-04-30 105 views
7

我是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); 

任何想法?

回答

21

您的視圖模型不應該與數據庫進行交互。視圖模型只能用於表示層(用戶界面) - 因此術語「視圖」模型。你應該有另一個與數據庫交互的模型(數據模型)。那麼你應該有一些類型的服務層來處理你的視圖模型和數據模型之間的轉換(反之亦然)。您的數據模型是由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