2013-04-30 36 views
7

Tôi mới sử dụng ASP.net MVC và đang sử dụng chế độ xem viewmodel thay vì viewbags để điền vào danh sách thả xuống của tôi vì tôi đã thấy hầu hết mọi người đề xuất chống lại chúng. Tôi có một giao diện người dùng slick mà cascading dropdowns và autocompletes (không được hiển thị ở đây) nhưng tôi dường như không thể có được dữ liệu của tôi lưu lại cơ sở dữ liệu.Lưu dữ liệu ViewModel vào Cơ sở dữ liệu trong ASP.NET MVC

Models:

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

ViewModel:

Bộ điều khiển:

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

tôi thấy một vài khuyến nghị sử dụng Automapper vì EntityState.Modified sẽ không làm việc, nhưng tôi 'không chắc chắn làm thế nào để cấu hình nó bởi vì bằng cách sử dụng mã dưới đây đã không làm việc.

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

Bất kỳ ý tưởng nào?

Trả lời

21

Mô hình chế độ xem của bạn không được tương tác với cơ sở dữ liệu. Xem mô hình chỉ nên được sử dụng trong lớp trình bày (giao diện người dùng) - do đó thuật ngữ "Xem" mô hình. Bạn nên có một mô hình (mô hình dữ liệu) khác tương tác với cơ sở dữ liệu của bạn. Sau đó, bạn nên có một số loại lớp dịch vụ xử lý chuyển đổi của bạn giữa mô hình xem và mô hình dữ liệu của bạn (và ngược lại). Mô hình dữ liệu của bạn là mô hình được tạo ra bởi Entity Framework (mà tôi giả định là những gì bạn đang sử dụng). Để xử lý các cập nhật cho cơ sở dữ liệu của bạn, bạn cần khởi tạo ngữ cảnh dữ liệu, lấy thực thể dữ liệu từ cơ sở dữ liệu của bạn, thực hiện các thay đổi đối với thực thể đó và gọi lưu các thay đổi tất cả trong ngữ cảnh dữ liệu đó. Ngữ cảnh dữ liệu sẽ theo dõi tất cả các thay đổi đối với các thực thể của bạn và áp dụng những thay đổi cần thiết cho cơ sở dữ liệu của bạn khi bạn gọi "lưu thay đổi". Ví dụ:

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

Trong ví dụ này, ngữ cảnh sẽ theo dõi mọi thay đổi đối với "dataModel". Khi "context.SaveChanges" được gọi, những thay đổi đó sẽ tự động được áp dụng cho cơ sở dữ liệu.

+0

Cảm ơn bạn rất nhiều! Đó chính xác là sự giúp đỡ tôi cần. – Jim

+0

Chức năng "UpdateCar" này hoạt động ở đâu? Bạn nói trong một số loại "Lớp dịch vụ", bạn có thể chính xác hơn không? Cảm ơn! – crunchy

+0

Dịch vụ thực sự không nên biết gì về giao diện người dùng. Vì vậy, chuyển đổi này sang tên miền/mô hình dữ liệu của bạn nên được thực hiện trong bộ điều khiển của bạn. Sau đó, bạn chuyển qua mô hình miền/dữ liệu sang phương thức lớp dịch vụ của bạn, thực hiện cập nhật. – RiceRiceBaby

Các vấn đề liên quan