2013-04-30 21 views
7

ASP.NET MVC'de yeniyim ve çoğu insanın kendilerine karşı önerdiği görüldüğünden bu yana, açılırlarımı doldurmak için görünüm kutuları yerine bir görünüm modeli kullanıyorum. Basamaklı açılır menüleri ve otomatik tamamlamalarını (burada gösterilmiyor) yapan kaygan bir kullanıcı arayüzüne sahibim ancak verilerimi yeniden veritabanına kaydettiremiyorum.Viewmodel verilerini ASP.NET MVC'de Veritabanına Kaydetme

Modeller:

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:

Denetleyici: Ben EntityState.Modified çalışmaz çünkü Automapper kullanmak için birkaç öneriler gördük

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

ama Aşağıdaki kodu kullanmadığından çalışmadığından nasıl yapılandıracağından emin değilim.

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

Herhangi bir fikir?

cevap

21

Görünüm modeliniz veritabanıyla etkileşimde bulunmamalıdır. Görünüm Modeller yalnızca sunum katmanında (kullanıcı arayüzü) kullanılmalıdır - dolayısıyla "Görünüm" modeli. Veritabanınızla etkileşime giren başka bir modele (veri modeli) sahip olmalısınız. Ardından, dönüşüm modelinizi görünüm modelinizle veri modeliniz arasında işleyen bir tür hizmet katmanı olmalıdır (ve tersi). Veri modeliniz Entity Framework tarafından oluşturulan modeldir (kullandığınız şeydir). Veritabanınızdaki güncellemeleri işlemek için bir veri bağlamı oluşturmalı, veri varlıklarını veri tabanından almalı, bu varlıkta değişiklik yapmalı ve değişiklikleri bu veri bağlamında kaydet. Veri içeriği, kuruluşunuzdaki tüm değişiklikleri takip eder ve "değişiklikleri kaydet" dediğinizde veritabanında gerekli değişiklikleri uygular. Örnek: Bu örnekte

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

, bağlam "datamodel" herhangi bir değişiklik takip eder. "Context.SaveChanges" çağrıldığında, bu değişiklikler otomatik olarak veritabanına uygulanır.

+0

Çok teşekkür ederim! Tam olarak ihtiyacım olan yardım buydu. – Jim

+0

Bu "UpdateCar" işlevi nerede yaşıyor? Bir çeşit "Hizmet Katmanı" demeniz, daha kesin olabilir misiniz? Teşekkürler! – crunchy

+0

Hizmet, UI ile ilgili hiçbir şey bilmemeli. Dolayısıyla, alan/veri modelinize yapılan bu dönüşüm, kontrolörünüzde yapılmalıdır. Ardından, etki alanını/veri modelini güncelleştirmeyi gerçekleştiren hizmet katmanı yöntemine iletirsiniz. – RiceRiceBaby

İlgili konular