2013-11-14 8 views
5

के साथ डेल्टा के साथ पैच को कार्यान्वित करना मेरे ओडाटा नियंत्रक में मैं अपनी ईएफ इकाइयों को डीटीओ में परिवर्तित कर रहा हूं क्योंकि इकाई में कई फ़ील्ड हैं जिनका उपयोग यूआई द्वारा नहीं किया जाता है। एएसपी.NET ओडाटा - डाटा ट्रांसफर ऑब्जेक्ट्स

इस सवाल-जवाब (ASP.NET WebApi OData support for DTOs) से पता चलता है कि कैसे मैं एफई क्वेरी के लिए OData URI से क्वेरी विकल्प लागू करते हैं और DTOs लौट सकते हैं। यह बहुत अच्छा है, इसका मतलब है कि मुझे डीबी से पूछताछ और छोटे इकाइयों को क्रमबद्ध करने का लाभ भी मिल रहा है।

हालांकि, जब मैं इसे अद्यतन करने की आवश्यकता हो तो मैं अपनी इकाई के लिए अपने पैच किए गए फ़ील्ड के साथ डेल्टा कैसे लागू करूं?

इकाई में फ़ील्ड नाम डीटीओ से मेल नहीं खाते हैं।

मैं डेल्टा से परिवर्तित फ़ील्ड संग्रह का उपयोग कर सकता हूं लेकिन फिर मैं सभी फ़ील्ड नामों को मैप करता हूं और इकाई में सभी गुणों को अपडेट करने के लिए प्रतिबिंब का उपयोग करता हूं।

क्या कोई बेहतर तरीका है?

क्या मुझे डीटीओ की बजाय मेरी इकाई का उपयोग करना चाहिए और तार पर डेटा के आकार को कम करने के लिए ओडाटा $ चयन पैरामीटर का उपयोग करना चाहिए।

मैं सिर्फ वेबएपीआई के लिए वापस लौटने चाहिए और अलग-अलग अद्यतन कार्य करता है जो केवल पैरामीटर की जरूरत है ले, उदाहरण के UpdateStartDate (पूर्णांक आईडी DATETIME, newStartDate)

+0

क्या आप मैपिंग को परिभाषित करने के लिए ऑटोमैपर का उपयोग कर रहे हैं? –

+0

हां मै मैपिंग के लिए ऑटोमैपर का उपयोग कर रहा हूं। – BenCr

उत्तर

3

मैं सिर्फ एक ही समस्या में पड़ गए और पाया है के लिए है नीचे दिए गए लिंक सहायक हो: http://qimata.com/?p=1381

समृद्धि के लिए, यहाँ कोड है जो AutoMapper एक डीटीओ को डाटाबेस इकाई मैप करने के लिए उपयोग करता है, तो आप डीटीओ वस्तुओं के लिए पट्टी लागू होते हैं, और उसके बाद AutoMapper का उपयोग वापस मैप करने के लिए सहेजने से पहले डेटाबेस इकाई में:

[AcceptVerbs("PATCH", "MERGE")] 
public virtual async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<DtoEntity> delta, CancellationToken cancellationToken) 
{ 
    Validate(delta.GetEntity()); 

    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    var entity = await _genericRepository.FindAsync(cancellationToken, key); 
    var dto = Mapper.Map<DtoEntity>(entity); 
    delta.Patch(dto); 
    Mapper.Map(dto, entity); 
    await _context.SaveChangesAsync(cancellationToken); 
    return Updated(dto); 
} 

उल्लेख करने के लायक एक और बात यह है कि जब EntityFramework के साथ ऑटोमैपर का उपयोग करते हैं, तो नेविगेशन गुणों के स्वचालित विस्तार से सावधान रहें। आप ExplicitExpansion विधि का उपयोग कर विस्तार निष्क्रिय कर सकते हैं:

Mapper.CreateMap<DbEntity, DtoEntity>() 
      .ForMember(dest => dest.Example, opt => opt.ExplicitExpansion()); 

मैं अपने DbContext निर्माता में Configuration.LazyLoadingEnabled = false; साथ Lazy लोड हो रहा है को निष्क्रिय करने के लिए किया था।

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