2016-11-04 12 views
5

मैं .NET कोर को एक एएसपी.NET 4.5 एप्लिकेशन पोर्ट करने का प्रयास कर रहा हूं और मेरे पास एक वास्तविक समस्या है जिसे मैं समझ नहीं पा रहा हूं।.NET कोर इकाई फ्रेमवर्क संग्रहित प्रक्रियाएं

मेरा मौजूदा एप्लिकेशन संग्रहीत प्रोसेस निष्पादित करता है जो एकाधिक डेटाटेबल्स के साथ एक डेटासेट लौटाता है। इकाई फ्रेमवर्क स्वचालित रूप से लौटाए गए फ़ील्ड को मेरी इकाई गुणों पर मैप कर सकता है लेकिन डेटासेट (स्वाभाविक रूप से) में पहले डेटाटेबल के साथ ही काम करता है।

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

मुझे पता है कि मैं संग्रहित प्रक्रिया को सीधे SqlConnection का उपयोग करके निष्पादित करने के सामान्य तरीके का उपयोग कर सकता हूं लेकिन मुझे आश्चर्य है कि एंटीटी फ्रेमवर्क के पास पहले से ऐसा करने का कोई तरीका है या नहीं।

+0

शायद यह उत्तर सहायक है? http://stackoverflow.com/a/9987939/968301 –

+0

इसलिए मैंने अभी देखा है कि डेटाटेबल और डेटासेट और उनके सभी मित्र .NET कोर में समर्थित नहीं हैं क्योंकि उन्हें विरासत माना जाता है। तो मुझे इसके बजाय डीबीआरडर का उपयोग करना होगा। क्या मैं इस धारणा में सही हूं? – DKhanaf

+0

मुझे लगता है कि आप अपनी संग्रहित प्रो को इस तरह से निष्पादित कर सकते हैं: 'dbContext.TableName.FromSql (" store_proc ") 'मुझे यकीन नहीं है कि क्या यह आपके सभी फ़ील्ड को अन्य तालिकाओं से मैप करेगा। –

उत्तर

10

इस समय, the way to execute stored procedures जो डेटा लौटाता है DbSet.FromSql विधि का उपयोग करना है।

using (var context = new SampleContext()) 
{ 
    var data= context.MyEntity 
     .FromSql("EXEC GetData") 
     .ToList(); 
} 

यह है कुछ सीमाएं:

  • यह एक DbSet
  • दिए गए डेटा DbSet प्रकार पर सभी गुण के लिए नक्शे चाहिए पर बुलाया जाना चाहिए
  • यह तदर्थ वस्तुओं का समर्थन नहीं करता ।

या आप सादे ADO.NET करना प्रारंभ कर सकते हैं:

using (var context = new SampleContext()) 
using (var command = context.Database.GetDbConnection().CreateCommand()) 
{ 
    command.CommandText = "GetData"; 
    command.CommandType = CommandType.StoredProcedure; 
    context.Database.OpenConnection(); 
    using (var result = command.ExecuteReader()) 
    { 
     // do something with result 
    } 
} 

वहाँ plans to introduce support for returning ad hoc types किसी चरण में एसक्यूएल क्वेरी से कर रहे हैं।

+0

यह मेरे द्वारा किए गए सभी शोधों से भी काफी कुछ हुआ है। मेरी समस्या का समाधान करने का एक तरीका एक डीएओ ऑब्जेक्ट पेश करना है जिसमें संपत्तियां हैं जो संग्रहीत प्रो से लौटे गए सभी फ़ील्ड को मैप करती हैं। फिर डीएओ को अपने व्यापार ऑब्जेक्ट में बदलने के लिए संभवतः अंतर्निहित रूपांतरण का उपयोग करें ताकि फ़ील्ड को बदलने के लिए सभी जरूरी तर्क लागू हो सकें ... – DKhanaf

+0

एक शेष मुद्दा संग्रहीत प्रो द्वारा लौटाए गए एकाधिक डेटासेट हैं। केवल एक ही तरीका जिसे मैं हल कर सकता हूं, संग्रहित प्रोप को दो में विभाजित करना और उन्हें व्यक्तिगत रूप से कॉल करना है, फिर डीएओ के उपरोक्त पैटर्न का पालन करें और सेवा परत में डीएओ को मेरे व्यापार ऑब्जेक्ट में विलय करें। यह शायद थोड़ा कम कुशल है क्योंकि मैं अब एक के बजाय दो कॉल कर रहा हूं, लेकिन एक तरह से थोड़ा क्लीनर और अधिक पठनीय। – DKhanaf

0

एकाधिक डेटासेट के साथ @ डीखानाफ के मुद्दे का उत्तर देने के लिए, आप अपने सभी परिणामों के साथ डेटासेट ऑब्जेक्ट भरने के लिए SqlDataAdapter का उपयोग कर सकते हैं। SqlDataAdapter को पूर्ण .NET Framework की आवश्यकता है, इसलिए आपको .NET 462 या कुछ समान लक्ष्यीकरण करते समय अपना .NETCore प्रोजेक्ट चलाने की आवश्यकता होगी।

  using (var context = new SampleContext()) 
      using (var command = context.Database.GetDbConnection().CreateCommand()) 
      { 
       command.CommandText = "GetData"; 
       command.CommandType = CommandType.StoredProcedure; 
       context.Database.OpenConnection(); 
       using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
       { 
        var ds = new DataSet(); 
        adapter.Fill(ds); 
        return ds; 
       } 

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