2010-09-29 4 views
5

मैं पॉको कोड जनरेटर के साथ इकाई फ्रेमवर्क 4 का उपयोग कर रहा हूं। मेरे पास एक संग्रहीत प्रक्रिया है जो एक आईएनएसईआरटी करता है और डालने वाले रिकॉर्ड की @@ पहचान देता है। मैं संग्रहीत प्रक्रिया को मेरी .edmx फ़ाइल में फ़ंक्शन के रूप में आयात करने का प्रयास कर रहा हूं, लेकिन मुझे इसका उपयोग करने में परेशानी हो रही है।इकाई फ्रेमवर्क 4 फ़ंक्शन आयात काम नहीं कर रहा

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

नोट: मेरे पास एक और संग्रहित प्रक्रिया है जो सीधे चयन करता है और यह ठीक से आयात किया जाता है और ऑब्जेक्ट कॉन्टेक्स्ट कोड में दिखाया जाता है।

क्या मैं कुछ गलत कर रहा हूं?

उत्तर

5

यदि आपकी संग्रहीत प्रक्रिया परिणाम सेट नहीं लौटाती है, तो आप विजुअल स्टूडियो में "फ़ंक्शन आयात जोड़ें" संवाद में "कोई संग्रह नहीं देता" "कोई नहीं" चुनते हैं, फिर फ़ंक्शन आयात को विधि के रूप में नहीं जोड़ा जाता है आपके जेनरेट ऑब्जेक्ट संदर्भ। (मैं अभी तक क्यों नहीं ढूंढ पा रहा हूं, लेकिन मैं अभी भी देख रहा हूं।)

स्पोक से वापसी मूल्य (उदाहरण के लिए, वापसी @@ पहचान) "का संग्रह नहीं है " सवाल। यही कारण है कि यह काम नहीं किया। सवाल यह पूछ रहा है कि स्पोक से परिणाम क्या परिणाम आता है।

तीन तरीके मैं के बारे में सोच सकते हैं आपकी समस्या को संभालने के लिए कर रहे हैं:

  1. एक चयन का उपयोग कर (जैसे, @@ पहचान के रूप में पहचान का चयन करें) और फिर उत्तर में Int32 का एक संग्रह निर्दिष्ट अपनी पहचान मूल्य लौटें "एक संग्रह का संग्रह" प्रश्न के लिए।

  2. अपने डालने के विवरण में उत्पादन खंड उपयोग करके अपनी पहचान मूल्य वापस लौटें और उस में 1.

  3. उपयोग इकाई एसक्यूएल के रूप में एक ही तरह से मिलता है और पहचान मूल्य एक बाहर पैरामीटर बनाते हैं। यहां बताया गया है कि यह कैसे करें: How to: Execute a Query Using a Stored Procedure with In and Out Parameters

मुझे उम्मीद है कि इससे मदद मिलती है।

5

POCO .Context.tt फ़ाइल की जांच में मैं रेखा के आसपास 111

if (edmFunction.ReturnParameter == null) 
{ 
    continue; 
} 
string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); 

जो किसी भी समारोह के आयात कि वापसी 'कोई नहीं' लिखा नहीं किया जाएगा मतलब है पर निम्न कोड मिला।

मैं अपने .Context.tt फ़ाइल को संशोधित किया है ताकि इसके बाद के संस्करण कोड

string returnTypeElement = @""; 
if (edmFunction.ReturnParameter == null) 
{ 
    returnTypeElement = @"void"; 
} else { 
    returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); 
} 

साथ बदल दिया है मैं तो समारोह घोषणा

<# 
    if(returnTypeElement != "void"){ 
#> 
    <#=Accessibility.ForMethod(edmFunction)#> ObjectResult<<#=returnTypeElement#>> <#=code.Escape(edmFunction)#>(<#=paramList#>) 
<# 
    } else { 
#> 
    <#=Accessibility.ForMethod(edmFunction)#> <#=returnTypeElement#> <#=code.Escape(edmFunction)#>(<#=paramList#>) 
<# 
    } 
#> 

(लाइन 118 के आसपास) के आसपास कुछ चेकों को जोड़ने के लिए किया है और रिटर्न स्टेटमेंट (लाइन 142 के आसपास)

<# 
    if(returnTypeElement != "void"){ 
#> 
     return base.ExecuteFunction<<#=returnTypeElement#>>("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>); 
<# 
    } else { 
#> 
     base.ExecuteFunction("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>); 
<# 
    } 
#> 

अब, यह हो सकता है सबसे सुरुचिपूर्ण समाधान (हार्ड-कोडिंग स्ट्रिंग्स!) नहीं है, लेकिन इसका मतलब यह है कि मैं अपनी संग्रहीत प्रक्रियाओं पर फ़ंक्शन आयात का उपयोग कर सकता हूं जो कुछ भी वापस नहीं करता है और .Context.cs फ़ाइल में बनाए गए संबंधित फ़ंक्शन हैं, और इसलिए इंटेलिसेंस के माध्यम से सुलभ है।

+0

अच्छी तरह से किया गया - अच्छी तरह से काम करता है! – BrianCooksey