2013-04-30 2 views
7

Я новичок в ASP.net MVC и использую viewmodel, а не viewbags для заполнения моих выпадающих списков, так как я видел, как большинство людей рекомендуют против них. У меня есть slick 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; } 
    } 

ViewModel:

Контроллер:

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

В этом примере, контекст будет отслеживать любые изменения в «DataModel». Когда вызывается «context.SaveChanges», эти изменения будут автоматически применены к базе данных.

+0

спасибо! Это была именно та помощь, в которой я нуждался. – Jim

+0

Где эта функция «Обновить»? Вы говорите в каком-то «сервисном слое», можете быть точнее? Благодаря! – crunchy

+0

Служба на самом деле ничего не должна знать о пользовательском интерфейсе. Поэтому это преобразование в модель вашего домена/данных должно выполняться в вашем контроллере. Затем вы передаете модель домена/данных методу уровня сервиса, который выполняет обновление. – RiceRiceBaby

Смежные вопросы