2013-05-16 8 views
7

में इकाई फ्रेमवर्क मॉडल नेविगेशन गुणों का अनुवाद करना मैं वर्तमान में एक एन-स्तरीय वेब प्रोजेक्ट पर काम कर रहा हूं। डेटा ट्रांसफर ऑब्जेक्ट्स और उनके लाभों में शोध करने के बाद हमने इस पैटर्न को जाने का फैसला किया। हमारी एएसपी.नेट एमवीसी वेबसाइट पर ईएफ डीबीकॉन्टेक्स्ट तक सीधी पहुंच नहीं है बल्कि इसके बजाय इकाई डेटा भेजने और प्राप्त करने के लिए डीटीओ का उपयोग किया जाएगा। एक सेवा/मैपिंग परत होगी जो डीटीओ और इकाई मॉडल के बीच परिवर्तित होगी।डीटीओ

मेरा सवाल है, इकाई मॉडल नेविगेशन गुणों को अपने डीटीओ में अनुवाद करने का सबसे अच्छा तरीका क्या है?

इकाई मॉडल::

public class Payment 
{ 
    public int ID { get; set; } 
    public DateTime? PaidOn { get; set; } 
    public decimal Amount { get; set; } 
    public string Reference { get; set; } 

    //Navigation Properties 
    public virtual PaymentMechanism PaymentMechanism { get; set; } 
    public virtual ICollection<Order> Orders { get; set; } 
} 

डीटीओ:

public class PaymentDto 
{ 
    public int ID { get; set; } 
    public DateTime? PaidOn { get; set; } 
    public decimal Amount { get; set; } 
    public string Reference { get; set; } 

    //--------Navigation Properties - Object Ids-------- 
    public int PaymentMechanismId { get; set; } 
    public ICollection<int> OrderIds { get; set; } 
} 

के रूप में देखा जा सकता है

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

मैं इस क्षेत्र में नया हूं इसलिए मेरी कुछ शब्दावली पूरी तरह से सही नहीं हो सकती है, लेकिन उम्मीद है कि आप समझेंगे कि मैं क्या प्राप्त कर रहा हूं। यदि आपको मुझे कुछ भी स्पष्ट करने या अतिरिक्त जानकारी प्रदान करने की आवश्यकता है, तो कृपया मुझे बताएं।

उत्तर

12

आप एक प्रक्षेपण का उपयोग कर DTOs लोड कर सकते हैं:

var paymentDtos = context.Payments 
    .Where(p => p.Amount >= 1000m) // just an example filter 
    .Select(p => new PaymentDto 
    { 
     ID = p.ID, 
     PaidOn = p.PaidOn, 
     Amount = p.Amount, 
     Reference = p.Reference, 
     PaymentMechanismId = p.PaymentMechanism.ID, 
     OrderIds = p.Orders.Select(o => o.ID) 
    }) 
    .ToList(); 

आप ICollection<int> के रूप में नहीं IEnumerable<int> के रूप में डीटीओ में OrderIds घोषित करने के लिए हालांकि, इस संकलन करना है।

मुझे यकीन नहीं है कि यह कुंजी संग्रह वास्तव में उपयोगी है या नहीं। तुम सिर्फ Payment की ID के आधार पर एक अलग सेवा विधि में कर आप बाद में आदेश लोड करने के लिए चाहते हैं सकता है, इसलिए जैसे:

public IEnumerable<OrderDto> GetPaymentOrders(int paymentID) 
{ 
    return context.Payments 
     .Where(p => p.ID == paymentID) 
     .Select(p => p.Orders.Select(o => new OrderDto 
     { 
      ID = o.ID, 
      //etc. mapping of more Order properties 
     })) 
     .SingleOrDefault(); 
} 
+0

आपके उत्तर के लिए धन्यवाद, मैं अपना समय की सराहना करते हैं। मैं आपको एक वोट दूंगा लेकिन मेरे पास पर्याप्त प्रतिनिधि नहीं है! यह प्रक्षेपण उदाहरण ऑटोमैपर जैसे मैपिंग लाइब्रेरी से अलग कैसे होता है? मुझे पता है कि मुख्य संग्रह के बारे में आपका क्या मतलब है, लेकिन यह इकाई संबंधों के संदर्भ को रखने का एक तरीका है। मुझे लगता है कि यह हमेशा जरूरी नहीं है लेकिन यह कुछ डीटीओ के लिए उपयोगी साबित हो सकता है। –

+0

@ChrisWhite: ऑटोमैपर का उपयोग करने से आपको 'भुगतान' इकाई को लोड करने के लिए मजबूर किया जाएगा जिसमें पहले सभी ऑर्डर 'डीबी (ऑर्डर के सभी कॉलम के साथ) से ऑर्डर होगा, फिर ऑटोमैपर लागू करें जो लोड किए गए अधिकांश गुणों को अनदेखा कर देगा क्योंकि आपका संग्रह डीटीओ में है केवल एक 'int' है। यह बहुत अधिक पूछताछ ओवरहेड हो सकता है। उपरोक्त प्रक्षेपण पूरी तरह से डेटाबेस में निष्पादित किया जाता है और प्रक्षेपण में अनुरोध किए गए कॉलम लौटाता है। – Slauma

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