2012-06-05 11 views
9

मुझे पता है कि इस विषय पर बहुत सी पोस्ट हैं लेकिन मुझे ऐसा कोई नहीं मिल रहा है जो मुझे जो चाहिए वह करने में मदद करता है। मुझे पता है कि मैं अंततः ऑटोमैपर का उपयोग कर रहा हूं लेकिन इससे पहले कि मैं इसके साथ खेलना शुरू कर दूं, मैं सीखना चाहता हूं कि चीजों को मैन्युअल रूप से कैसे करें। मैं एक व्यूमोडेल बनाना चाहता हूं, इसे अपनी संस्थाओं से मूल्यों के साथ एक भंडार के माध्यम से पॉप्युलेट करना चाहता हूं और इसे अपने दृश्य में भेजना चाहता हूं। इस ध्वनि के रूप में सरल, मैं इसे करने के लिए तस्करी कर रहा हूँ। मैं एमवीसी 3, ईएफ 4.3, डेटाबेस पहले का उपयोग कर रहा हूँ। मैंने अपनी कक्षाओं को स्वतः उत्पन्न किया है।मैं मैन्युअल रूप से व्यूमोडेल (ऑटोमैपर का उपयोग नहीं कर रहा हूं)

सकल निकाय:: शिपिंग हैडर

using System; 
using System.Collections.Generic; 

namespace My.Models 
{ 
public partial class ShippingHdr 
{ 
    public ShippingHdr() 
    { 
     this.ShippingLI = new HashSet<ShippingLI>(); 
    } 

    public int ID { get; set; } 
    public int ShipToSiteID { get; set; } 
    public Nullable<System.DateTime> DateShipped { get; set; } 
    public Nullable<System.DateTime> EstDeliveryDate { get; set; } 
    public string FromSitePOC { get; set; } 
    public Nullable<int> ShipperID { get; set; } 
    public string TrackingNo { get; set; } 
    public string Comments { get; set;} 
    public virtual Shippers Shippers { get; set; } 
    public virtual ICollection<ShippingLI> ShippingLI { get; set; } 
} 

} 

यहाँ मेरी ViewModel

है मैं प्रासंगिक संस्थाओं (संक्षिप्त/इस पोस्ट के लिए नाम बदला) और वर्गों पोस्टिंग कर रहा हूँ, यहाँ क्या मैं अब तक किया है
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace My.Models.ViewModels 
{ 

public class ShippingHeaderSummaryVM 
{ 
    public int ID { get; set; } 
    public string Site { get; set; } 
    public Nullable<System.DateTime> DateShipped { get; set; } 
    public Nullable<System.DateTime> EstDeliveryDate { get; set; } 
    public string TrackingNo { get; set; } 
    public string HeaderComments { get; set; } 
    public string Shipper { get; set; } 
    public int NumOrders { get; set; } 
    public string Site { get; set; } 


} 

}

यहाँ एक प्रश्न मैं आइटम मैं के साथ मेरी ViewModel पॉप्युलेट करने के लिए उपयोग करना चाहते हैं वापस जाने के लिए मिल गया है। मेरा मानना ​​है कि इसके लिए सबसे अच्छी जगह एक रिपोजिटरी में है। मैंने सत्यापित किया कि यह डेटा मैं लिंककैड का उपयोग कर चाहता हूं (इसलिए मेरे डीबीकॉन्स्ट के लिए अनुपलब्ध संदर्भ)। मैं सिर्फ ViewModel करने के लिए क्वेरी से मूल्यों को प्राप्त करने के लिए पता नहीं कैसे:

var shipments = from h in c.ShippingHdrs 
         where (h.ShippingLI.Count > 1) 
         join 
         e in c.vHr_Employees on h.CreatedBy equals e.ID 
         join 
         s in c.Shippers on h.ShipperID equals s.ShipperID 
         join 
         r in vAaiomsSites on h.ShipToSiteID equals r.SiteID 

         select new 
         { 
          h.ID, 
          r.Site, 
          h.EstDeliveryDate, 
          h.DateShipped, 
          h.TrackingNumber, 
          h.HeaderComments, 
          e.LastName, 
          h.ShippingLI.Count, 
          s.Shipper 
                 }; 

तो क्या मैं Automapper का उपयोग किए बिना ऐसा करने के लिए, फिर से चाहते हैं, ShippingHdr से पंक्तियों के सभी के साथ ViewModel को भरने के लिए है इकाई और इसे मेरे विचार में पास करें।

ShippingHeaderSummaryVM लदान

ID = h.ID 
Site = r.Site 
DateShipped = h.DateShipped 
EstDeliveryDate = h.EstDeliveryDate 
TrackingNo = h.TrackingNumber 
FromSitePOC = e.LastName 
NumOrders = h.ShippingLI.Count 
Shipper = s.Shipper 
HeaderComments = h.HeaderComments 

मैं यहाँ अटक कर रहा हूँ से मैप किया गया:

यहाँ filelds मैप किया जा करने की आवश्यकता है। मैं क्वेरी से ViewModel कैसे पॉप्युलेट करूं? फिर मैं अपने नियंत्रक से उस क्रिया को कैसे कॉल करूं?

मुझे आशा है कि मैंने पर्याप्त जानकारी दी है, किसी भी मदद की सराहना की जाएगी।

+0

टिप टाइपो सुधार के लिए धन्यवाद, ' तुम सिर्फ जा सकते हैं '' दिनांक समय –

+0

आप 'कहने के लिए चयन नई ShippingHeaderSummaryVM में सक्षम होना चाहिए {}? ', इनपुट के लिए मॉडल बाइंडर का उपयोग करने के बजाय यह आप आउटपुट है? –

+0

@ लैविंस्की, मैंने अभी इस पोस्ट के लिए मेरी जेनरेट की गई इकाइयों की एक कॉपी/पेस्ट बनाई है, मैं वास्तव में समझ में नहीं आता कि कुछ जहां नलबल के साथ उत्पन्न हुआ, जबकि अन्य नहीं थे। मैंने सोचा कि यह मेरी एसक्यूएल टेबल के साथ मेल खाएगा, लेकिन यह नहीं था। –

उत्तर

5

आदेश आपके विचार मॉडल वस्तु के आधार पर लदान आप अपना दृश्य मॉडल के आधार पर लदान का एक संग्रह करने के लिए अपने डेटाबेस से लदान के अपने संग्रह से मैप करने के लिए एक मानचित्रण विधि बनाने के लिए की आवश्यकता होगी की एक सूची को पॉप्युलेट करने के लिए:

var model = new List<ShippingHeaderSummaryVM>(); 

foreach(var h in shipments) 
{ 

    var viewModel = new ShippingHeaderSummaryVM 
    { 
    ID = h.ID 
    Site = r.Site 
    DateShipped = h.DateShipped 
    EstDeliveryDate = h.EstDeliveryDate 
    TrackingNo = h.TrackingNumber 
    FromSitePOC = e.LastName 
    NumOrders = h.ShippingLI.Count 
    Shipper = s.Shipper 
    HeaderComments = h.HeaderComments 
    } 

    model.Add(viewModel); 
} 

return model; 

एक तरफ ध्यान दें के रूप में, यह एक एक लाइनर हो जाता है के बाद आप AutoMapper ऊपर है और चल रहा है:

var model = Mapper.Map<IEnumerable<ShippingHdr>, IEnumerable<ShippingHeaderSummaryVM>>(shipments); 

है, मैन्युअल रूप से काम करने के लिए सीखने महान है। मैन्युअल रूप से मैपिंग मॉडल आपको वास्तव में किसी भी रूप या फॉर्म में लाभ नहीं पहुंचाते हैं। ऑटोमैपर के साथ जाओ।

+1

मैं ऑटोमैपर के साथ जाने का इरादा रखता हूं, मुझे लगता है कि मुझे पहले यांत्रिकी को वास्तव में समझने की ज़रूरत है। इसे आजमाने के लिए इंतजार नहीं कर सकता। धन्यवाद –

+0

जब आप कहते हैं कि मैन्युअल रूप से मैपिंग कोई लाभ नहीं प्रदान करता है, तो मैंने एक लेख पढ़ा है [लिंक] http://www.devtrends.co.uk/blog/stop-using-automapper-in-your-data-access- कोड जो कहता है कि ऑटोमैपर का उपयोग करके, मैपिंग होने से पहले पूरा मॉडल पढ़ा जाता है। प्लगइन का उपयोग करने के अलावा, यह एक प्रदर्शन समस्या होने पर मैन्युअल रूप से मानचित्र करने के संभावित कारण की तरह लगता है। मेरे ऐप के उपयोगकर्ता सैटेलाइट आधारित इंटरनेट सेवा का उपयोग कर रहे हैं और विलंबता एक हत्यारा है, मैं जितना संभव हो डेटाबेस एक्सेस को कम करना चाहता हूं। Automapper मुझे जरूरत से अधिक लाने के लिए नहीं होगा? –

+0

"मैपिंग्स" स्वयं स्वचालित रूप से उपयोग करने वाले स्वचालित रूप से ग्लोबल.एक्सएक्स विधि के ऑनएप्लिकेशंस स्टार्ट किए गए अनुभाग में बनाए जाते हैं। इस कॉन्फ़िगरेशन के भीतर आप automapper को बता सकते हैं कि आप अपने डोमेन इकाई से अपने दृश्य मॉडल में कौन से फ़ील्ड लेना चाहते हैं। मेरे अनुभव से ऑटोमैपर का प्रदर्शन मैन्युअल मैपिंग की तुलना में अलग नहीं है और मुझे लगता है कि मेरा कोड क्लीनर और अनुसरण करना आसान है। आईएमओ लाभ जो ऑटोमैपर तालिका में लाता है, बहुत ही नगण्य हिट (यदि कोई हो) का वजन होता है। आप इकाई को अपने मैपिंग का परीक्षण भी कर सकते हैं! – Jesse

1

तुम भी Linq का उपयोग कर सकते इस तरह कुछ करने के लिए ...

shipments.Select(h => new ShippingHeaderSummaryVM(){ 
    ID = h.ID, 
    Site = r.Site, 
    DateShipped = h.DateShipped, 
    EstDeliveryDate = h.EstDeliveryDate, 
    TrackingNo = h.TrackingNumber, 
    FromSitePOC = e.LastName, 
    NumOrders = h.ShippingLI.Count, 
    Shipper = s.Shipper, 
    HeaderComments = h.HeaderComments 
}); 

ध्यान दें कि मानचित्रण दृश्य मॉडल एक दृश्य को पारित करने के लिए बहुत अच्छा है, जबकि, हमेशा इसे मैन्युअल रूप से करते हैं जब एक दृश्य के मॉडल से पढ़ने अद्यतन करने के लिए आपका डेटाबेस

संपादित करें: बजाय `Nullable की :-)

संबंधित मुद्दे