2013-04-30 11 views
7

में डेटाबेस में व्यूमोडेल डेटा सहेजना मैं एएसपीनेट एमवीसी के लिए नया हूं और मेरे ड्रॉपडाउन को पॉप्युलेट करने के लिए व्यूबैग के बजाय व्यूमोडेल का उपयोग कर रहा हूं क्योंकि मैंने देखा है कि ज्यादातर लोग उनके खिलाफ अनुशंसा करते हैं। मेरे पास एक स्लिम यूआई है जो कैस्केडिंग ड्रॉपडाउन और ऑटोकंपलेट्स (यहां दिखाया नहीं गया है) लेकिन मुझे लगता है कि मेरा डेटा डेटाबेस में वापस सहेजा नहीं जा सकता है।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

आपका दृश्य मॉडल डेटाबेस के साथ सहभागिता नहीं करनी चाहिए। मॉडल देखें केवल प्रस्तुति परत (उपयोगकर्ता इंटरफ़ेस) में उपयोग किया जाना चाहिए - इसलिए शब्द "व्यू" मॉडल। आपके पास एक और मॉडल (डेटा मॉडल) होना चाहिए जो आपके डेटाबेस से इंटरैक्ट करता है। फिर आपके पास कुछ प्रकार की सेवा परत होनी चाहिए जो आपके व्यू मॉडल और आपके डेटा मॉडल (और इसके विपरीत) के बीच अपना रूपांतरण संभालती है। आपका डेटा मॉडल एंटिटी फ्रेमवर्क द्वारा उत्पन्न मॉडल है (जो मुझे लगता है कि आप क्या उपयोग कर रहे हैं)। अपने डेटाबेस में अपडेट को संभालने के लिए, आपको डेटा संदर्भ को तुरंत चालू करने, अपने डेटाबेस से डेटा इकाई को पकड़ने, उस इकाई में परिवर्तन करने की आवश्यकता है, और उस डेटा संदर्भ में सभी परिवर्तनों को सहेजने की आवश्यकता है। डेटा संदर्भ आपकी इकाइयों में सभी परिवर्तनों का ट्रैक रखेगा और जब आप "परिवर्तन सहेजें" कॉल करते हैं तो अपने डेटाबेस में आवश्यक परिवर्तन लागू करें। उदाहरण:

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

+0

यह "अपडेटकर" फ़ंक्शन कहां रहता है? आप किसी प्रकार की "सेवा परत" में कहते हैं, क्या आप अधिक सटीक हो सकते हैं? धन्यवाद! – crunchy

+0

सेवा वास्तव में यूआई के बारे में कुछ नहीं जानना चाहिए। तो आपके डोमेन/डेटा मॉडल में यह रूपांतरण आपके नियंत्रक में किया जाना चाहिए। फिर आप डोमेन/डेटा मॉडल में अपनी सेवा परत विधि में पास करते हैं जो अद्यतन करता है। – RiceRiceBaby