7

मेरे पास मेरे डेटाबेस में एक एसपी है। E124.1 के लिए, DbContext API का उपयोग कर।इकाई फ्रेमवर्क EF4.1 - संग्रहित प्रक्रिया "कंटेनर में नहीं मिल सका"

डेटा मॉडल से फ़ंक्शन आयात करने के बाद, संग्रहीत प्रक्रिया के संदर्भ मेरे विकास वातावरण में ठीक काम करते हैं। लेकिन सर्वर पर प्रकाशित होने पर, यह एक संदेश के साथ विफल रहता है जैसे: FunctionImport 'SqlSearch' कंटेनर 'TallyJ2Entities' में नहीं पाया जा सका। अन्य सभी डेटा एक्सेस ठीक काम कर रहा है।

ऐसा लगता है कि उत्पादन में, ईएफ 4 कॉन्फ़िगरेशन के कुछ पहलू भुला दिए जाते हैं।

डेटाबेस समान हैं, और दोनों सर्वर SQL 2008 हैं (स्थानीय एक्सप्रेस एसपी 1 10.50.2500 है, होस्ट एक्सप्रेस आरटीएम 10.50.1600 है)।

मैंने ईडीएमएक्स संपादक को सीधे उत्पादन डेटाबेस पर इंगित किया है, और अपडेट किया है। नतीजे विकास में ठीक काम करते थे, लेकिन सर्वर पर उसी तरह विफल रहता है।

अन्य समान प्रश्न here सहायता नहीं करते हैं। ऐसा लगता है कि किसी और को एक ही समस्या है enter link description here

कोई सुझाव?

अद्यतन: मुझे पता चला है कि जब मैं डीबग मोड में होस्ट को तैनात करता हूं तो समस्या दूर हो जाती है!

मेरी DbContext व्युत्पन्न वर्ग के अंदर, मैं इस कोड डाल:

((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace 
var findFunction = metadataWorkspace.GetItems(DataSpace.SSpace) 
      .SelectMany(gi => gi.MetadataProperties) 
      .Where(m=> Equals(m.Value, "SqlSearch")) 
      .Select(m => "Found {0}".FilledWith(m.Value)) 
      .FirstOrDefault(); 

जब मैं findFunction परिणाम लॉग इन, यह पता चला है कि सर्वर (रिलीज़ मोड में) यह नहीं मिला, विकास में है, यह पाया जाता है।

+0

इस बारे में कई सवाल हैं: http://stackoverflow.com/a/3501174/2942 http://stackoverflow.com/questions/4892926/entity-framework-4-pocos-stored-procedure- त्रुटि-द-फ़ंक्शनिमपोर्ट-नहीं - – friism

+0

धन्यवाद। लेकिन उन अन्य विचारों में से कोई भी मेरे लिए काम नहीं करता था। –

उत्तर

18

यदि ईएफ 4.1 और उसके बाद का उपयोग करते हैं, तो "ऑब्जेक्ट पैरामीटर" को "SqlParameter" और "ExecuteFunction" को "ConecxtStoreQuery" में अपने Context.cs फ़ाइल में बदलें।

"ExecuteStoreQuery" विधि भी आपको संग्रहीत प्रो के सामने पैरामीटर नाम जोड़ने की अपेक्षा करता है। नीचे एक स्निपेट खोजें:

var param1Parameter = param1 != null ? 
new SqlParameter("param1", param1) : 
new SqlParameter("param1", typeof(string)); 

var param2Parameter = param2 != null ? 
new SqlParameter("param2", param2) : 
new SqlParameter("param2", typeof(int)); 

return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<sp_TestSproc_Result>("sp_TestSproc @param1, @param2", param1Parameter, param2Parameter); 

यदि आपका कोड जेनरेट करने के लिए टेम्पलेट का उपयोग करना है, तो आपको नीचे स्निपेट भी उपयोगी हो सकता है। अर्थात। मैंने मानक "फ्लुएंट टीटी" जनरेटर को ईएफ 4.3:

void WriteFunctionImport(EdmFunction edmFunction, bool includeMergeOption) 
    { 
     var parameters = FunctionImportParameter.Create(edmFunction.Parameters, Code, EFTools); 
     var paramList = String.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray()); 
     var returnType = edmFunction.ReturnParameter == null ? null : EFTools.GetElementType(edmFunction.ReturnParameter.TypeUsage); 
     var processedReturn = returnType == null ? "int" : "ObjectResult<" + MultiSchemaEscape(returnType) + ">"; 

     if (includeMergeOption) 
     { 
      paramList = Code.StringAfter(paramList, ", ") + "MergeOption mergeOption"; 
     } 
    #> 

     <#=AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction))#> <#=processedReturn#> <#=Code.Escape(edmFunction)#>(<#=paramList#>) 
     { 
    <#+ 
      if(returnType != null && (returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType || 
             returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.ComplexType)) 
      { 
    #> 
      ((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(<#=MultiSchemaEscape(returnType)#>).Assembly); 

    <#+ 
      } 

      foreach (var parameter in parameters.Where(p => p.NeedsLocalVariable)) 
      { 
       var isNotNull = parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"; 
       var notNullInit = "new SqlParameter(\"" + parameter.EsqlParameterName + "\", " + parameter.FunctionParameterName + ")"; 
       var nullInit = "new SqlParameter(\"" + parameter.EsqlParameterName + "\", typeof(" + parameter.RawClrTypeName + "))"; 
    #> 
      var <#=parameter.LocalVariableName#> = <#=isNotNull#> ? 
       <#=notNullInit#> : 
       <#=nullInit#>; 

    <#+ 
      } 

      var genericArg = returnType == null ? "" : "<" + MultiSchemaEscape(returnType) + ">"; 
      var callParams = Code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())); 
      var spParams = Code.StringBefore("@", String.Join(", @", parameters.Select(p => p.EsqlParameterName).ToArray())); 

      if (includeMergeOption) 
      { 
       callParams = ", mergeOption" + callParams; 
      } 
    #> 
      return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<#=genericArg#>("<#=edmFunction.Name#> <#=spParams#>" 
         <#=callParams#>); 
     } 
    <#+ 
     if(!includeMergeOption && returnType != null && returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType) 
     { 
      WriteFunctionImport(edmFunction, true); 
     } 
    } 
+0

धन्यवाद ... मैं इसे अगले सप्ताह या दो में आजमाउंगा। उम्मीद है कि डीबग मोड से बाहर निकलने में सक्षम हो! –

+1

यह मेरे लिए काम किया! – tclark333

+0

बिल्कुल सही, धन्यवाद! यह नहीं पता कि यह मुझे अपने आप से बाहर निकालने में कितना समय लगेगा! – Marc

4

हमने पाया कि यह गलत कनेक्शन स्ट्रिंग होने के कारण हुआ था।

<connectionStrings> 
    <add name="MyModel_Entities" connectionString="metadata=res://*/Models.MyModel.csdl|res://*/Models.MyModel.ssdl|res://*/Models.MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=192.168.1.200;initial catalog=MyDb_Live;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

यह कहाँ का कहना है इस MyModel अपने .edmx मॉडल फ़ाइल के नाम के साथ अनुरूप होना चाहिए:

एफई एक कनेक्शन स्ट्रिंग है कि इस तरह दिखता है की जरूरत है।

आप एक connectionstring की नकल की है, तो कहीं और से यह कुछ ऐसा दिखाई देगा: ConnectionStrings के अंत में ProviderName में

<add name="MyModel_Entities" connectionString="Data Source=.;Initial Catalog=MyDb_Live;Integrated Security=SSPI;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" /> 

नोट विशेष रूप से अंतर।

एनबी हम ईएफ 6.1 का उपयोग कर रहे हैं लेकिन मेरा मानना ​​है कि यह पहले के संस्करणों पर भी लागू होता है। यदि आप अपनी कनेक्शन स्ट्रिंग को ठीक करते हैं तो हमने पाया है कि आप टी 4 टेम्पलेट्स द्वारा उत्पन्न कोड का उपयोग करना जारी रख सकते हैं। आपको ऑब्जेक्ट पैरामीटर को SqlParameter और ExecuteFunction को ExecuteStoreQuery पर स्विच करने की आवश्यकता नहीं है।

+0

मैं सहमत हूं ... कनेक्शन स्ट्रिंग प्रारूप ईएफ के लिए महत्वपूर्ण हैं। उस पर प्रकाश डालने के लिए धन्यवाद। –

0

मुझे नहीं लगता कि कनेक्शन स्ट्रिंग समस्या है। मेरे मामले में मैं स्टोर प्रक्रिया को कॉल करने में सक्षम नहीं हूं लेकिन मैं अपने डीबी में डेटा लिखने में सक्षम हूं। इसका मतलब है कि हमारा कनेक्शन उचित है।