2011-01-30 9 views
111

मैंने पहले ईएफ कोड के कई प्रस्तुतियों को देखा है और यह नहीं देखा है कि ईएफसीएफ संग्रहित प्रक्रियाओं के साथ कैसे काम करता है।क्या इकाई फ्रेमवर्क कोड पहले समर्थन संग्रहीत प्रक्रियाओं का समर्थन करता है?

मैं एक विधि कैसे घोषित कर सकता हूं जो कुछ एसपी का उपयोग करेगा? क्या मैं एक विधि को एक विधि में पास कर सकता हूं जो स्पैम पैरामीटर के लिए मैन्युअल रूप से इकाई गुणों को मैप किए बिना स्प को कॉल करता है?

इसके अलावा, अगर मैं अपना मॉडल बदलूं तो क्या होगा? मॉडल से टेबल को पुनर्निर्मित करते समय क्या यह मेरे स्पैम को छोड़ देगा? और ट्रिगर्स के बारे में क्या?

यदि इन चीजों का समर्थन नहीं है, तो क्या भविष्य में उनका समर्थन करने की कोई योजना है?

+5

ईएफ रोडमैप इंगित करता है कि ईएफ 6 कोड फर्स्ट के लिए संग्रहीत प्रक्रियाओं और कार्यों का समर्थन करेगा। http://entityframework.codeplex.com/wikipage?title=Roadmap – frennky

+0

यह भी देखें: http://stackoverflow.com/questions/4873607/how-to-use-dbcontext-database-sqlquerytelementsql-params-with-stored-proced –

उत्तर

66

संपादित करें: ईएफ 4.1 (नीचे) के लिए मेरा मूल उत्तर अब पुराना है। कृपया the answer below from Diego Vega देखें (जो माइक्रोसॉफ्ट में ईएफ टीम पर काम करता है)!


@gsharp और शॉन मक्लेन: आपको यह जानकारी कहां मिल रही है? क्या आपके पास अभी भी अंतर्निहित ऑब्जेक्ट कॉन्टेक्स्ट तक पहुंच नहीं है?

IEnumerable<Customer> customers = 
    ((IObjectContextAdapter)this) 
    .ObjectContext.ExecuteStoreQuery<Customer>("select * from customers"); 

संग्रहित प्रो के साथ "चयन" कथन को बदलें, और वहां आप जाते हैं।

आपके अन्य प्रश्न के लिए: हां, दुर्भाग्यवश आपके एसपी। को गिरफ्तार कर लिया जाएगा। आपको अपने कोड में "प्रक्रिया बनाएं" कथन जोड़ना पड़ सकता है।

एफई 4.2 के लिए:

var customers = context.Database.SqlQuery<Customer>("select * from customers") 
+0

धन्यवाद। क्या आप मुझे कुछ लिंक पर इंगित कर सकते हैं जिनके पास इस विषय के बारे में अधिक जानकारी है। – frennky

+1

आप ऑब्जेक्ट कॉन्टेक्स्ट ऑब्जेक्ट (ExecuteStoreQuery, ExecuteFunction, और ExecuteStoreCommand) पर तीन निष्पादन फ़ंक्शंस देखना चाहते हैं। – anon

+0

मैंने सवाल को गलत समझा। मैं सोच रहा था कि वह एसपी के कोड को पहले आधार पर बनाना चाहता है। – gsharp

50

अद्यतन: EF6 से, एफई कोड पहले समर्थन संग्रहीत आवेषण, अद्यतन करने के लिए प्रक्रिया मानचित्रण करता है और हटाता है। आप MapToStoredProcedures विधि का उपयोग कर मॉडल निर्माण के दौरान संग्रहीत प्रक्रिया मैपिंग निर्दिष्ट कर सकते हैं। हम उन परिचालनों के लिए मूल संग्रहित प्रक्रियाओं के स्वचालित मचान का भी समर्थन करते हैं। सुविधा विनिर्देश here देखें।

मूल जवाब: हम कोड-प्रथम में मॉडल पहली रिलीज में में मानचित्रण संग्रहित प्रक्रियाओं के लिए समर्थन की जरूरत नहीं होगी, न ही हम एक तरह से स्वचालित रूप से अपने प्रकार से CRUD संचालन के लिए संग्रहित प्रक्रियाओं उत्पन्न करने के लिए होगा। ये वे विशेषताएं हैं जिन्हें हम भविष्य में जोड़ना चाहते हैं।

के रूप में यह इस सूत्र में उल्लेख किया गया था, यह संभव है ObjectContext में वापस आने का लेकिन DbContext भी अच्छा API प्रदान करता है देशी एसक्यूएल प्रश्नों और आदेश (जैसे DbSet.SqlQuery, DbContext.Database.SqlQuery और DbContext.Database.ExecuteSqlCommand निष्पादित करने के लिए)। विभिन्न SqlQuery संस्करणों में समान मूल भौतिककरण कार्यक्षमता है जो ईएफ 4 में मौजूद है (जैसे ExecuteStoreQuery: http://msdn.microsoft.com/en-us/library/dd487208.aspx)।

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

+6

बीटीडब्लू, मैंने कुछ दिनों पहले एक ब्लॉग पोस्ट लिखा था कि संग्रहित प्रक्रियाओं का आह्वान करने के लिए इन विधियों का उपयोग कैसे करें, यहां तक ​​कि आउटपुट पैरामीटर के साथ संग्रहीत प्रक्रियाओं: http://blogs.msdn.com/b/diego/archive/2012/01 /10/how-to-execute-stored-procedures-sqlquery-in-the-dbcontext-api.aspx। – divega

+3

देर 2013, ईएफ 6 अभी भी विकास में है। Sprocs के लिए समर्थन में सुधार करने के लिए बस तीन साल इंतजार, श्वास। – DOK

+1

@divega क्या संग्रहीत प्रक्रिया से मूल्यों का चयन करने के लिए दृढ़ता से टाइप किया गया समर्थन है - यह कोड-पहला दृष्टिकोण ऑब्जेक्ट लाइफ-टाइम प्रबंधित करने के लिए विशिष्ट लगता है? विशिष्ट रूप से, जटिल खोजों के लिए, एक संपूर्ण ROWoo आउटपुट पैरामीटर के साथ एक spFooSearch संग्रहीत प्रक्रिया का उपयोग कर। –

31
public IList<Product> GetProductsByCategoryId(int categoryId) 
    { 
     IList<Product> products; 

     using (var context = new NorthwindData()) 
     { 
      SqlParameter categoryParam = new SqlParameter("@categoryID", categoryId); 
      products = context.Database.SqlQuery<Product>("Products_GetByCategoryID @categoryID", categoryParam).ToList(); 
     } 

     return products; 
    } 

    public Product GetProductById(int productId) 
    { 
     Product product = null; 

     using (var context = new NorthwindData()) 
     { 
      SqlParameter idParameter = new SqlParameter("@productId", productId); 
      product = context.Database.SqlQuery<Product>("Product_GetByID @productId", idParameter).FirstOrDefault(); 
     } 

     return product; 
    } 
8

एक और अधिक प्रकार सुरक्षित समाधान इस होगा:

http://strugglesofacoder.blogspot.be/2012/03/calling-stored-procedure-with-entity.html

इस वर्ग के उपयोग है:

var testProcedureStoredProcedure = new TestProcedureStoredProcedure() { Iets = 5, NogIets = true }; 

var result = DbContext.Database.ExecuteStoredProcedure(testProcedureStoredProcedure); 
+0

लिंक अब सक्रिय नहीं है, लेकिन यहां संग्रह है: http://web.archive.org/web/20150430090848/http://www.lucbos.net/2012/03/calling-stored-procedure-with-entity .html –

2

नेट कोर (EntityFrameworkCore) के लिए, मैं कर दिया गया है उन्हें काम करने में सक्षम।

सबसे अच्छा नहीं हो सकता है, लेकिन यह निश्चित रूप से काम करता है।

संग्रहीत प्रक्रिया को जोड़ने के लिए प्रवास लग रहा है this की तरह:

using Microsoft.EntityFrameworkCore.Migrations; 
using System.Text; 

namespace EFGetStarted.AspNetCore.NewDb.Migrations 
{ 
    public partial class StoredProcedureTest : Migration 
    { 
     protected override void Up(MigrationBuilder migrationBuilder) 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.AppendLine("CREATE PROCEDURE GetBlogForAuthorName"); 
      sb.AppendLine("@authorSearch varchar(100)"); 
      sb.AppendLine("AS"); 
      sb.AppendLine("BEGIN"); 
      sb.AppendLine("-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements."); 
      sb.AppendLine("SET NOCOUNT ON;"); 
      sb.AppendLine("SELECT Distinct Blogs.BlogId, Blogs.Url"); 
      sb.AppendLine("FROM Blogs INNER JOIN"); 
      sb.AppendLine("Posts ON Blogs.BlogId = Posts.BlogId INNER JOIN"); 
      sb.AppendLine("PostsAuthors ON Posts.PostId = PostsAuthors.PostId Inner JOIN"); 
      sb.AppendLine("Authors on PostsAuthors.AuthorId = Authors.AuthorId"); 
      sb.AppendLine("Where Authors.[Name] like '%' + @authorSearch + '%'"); 
      sb.AppendLine("END"); 

      migrationBuilder.Sql(sb.ToString()); 
     } 

     protected override void Down(MigrationBuilder migrationBuilder) 
     { 
      migrationBuilder.Sql("DROP PROCEDURE GetBlogForAuthorName"); 
     } 
    } 
} 

मैं तो यह following कोड के साथ कह सकते हैं:

var blogs = _context.Blogs.FromSql("exec GetBlogForAuthorName @p0", "rod").Distinct(); 

बाद में करने के लिए संबंधित डेटा के कुछ (एक हो रही करने की कोशिश की कई संबंध डेटा जैसे पोस्ट सामग्री) और ब्लॉग भरे हुए पोस्ट सामग्री के साथ वापस आ गया।

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