क्या एंटिटी फ्रेमवर्क कोड पहले संग्रहीत प्रक्रियाओं का समर्थन करता है?


112

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

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

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

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


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

जवाबों:


66

संपादित करें: EF4.1 (नीचे) के लिए मेरा मूल उत्तर अब पुराना है। कृपया डिएगो वेगा (जो Microsoft में EF टीम पर काम करता है) से नीचे का उत्तर देखें !


@gsharp और Shawn Mclean: आपको यह जानकारी कहां से मिल रही है? क्या आपके पास अभी भी अंतर्निहित ObjectContext तक पहुंच नहीं है?

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

"सलेक्ट" स्टेटमेंट को स्टोर किए गए प्रॉप के साथ बदलें, और वहां आप जाएं।

जैसा कि आपके अन्य प्रश्न के लिए है: हाँ, दुर्भाग्य से आपके सपा की इच्छा पूरी हो जाएगी। आपको अपने कोड में "CREATE PROCEDURE" कथन जोड़ने की आवश्यकता हो सकती है।

EF 4.2 के लिए:

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

धन्यवाद। क्या आप मुझे कुछ लिंक की ओर इशारा कर सकते हैं, जो इस विषय में अधिक जानकारी रखते हैं।
frennky

1
आप ObjectContext ऑब्जेक्ट (ExecuteStoreQuery, ExecuteFunction और ExecuteStoreCommand) पर तीन एक्सक्यूट फ़ंक्शन को देखना चाहेंगे।
आनन

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

आप Context.OnModelCreating को ओवरराइड कर सकते हैं और कोड के माध्यम से संग्रहीत प्रोक्स जैसे डेटाबेस आइटम बनाने के लिए कस्टम लॉजिक को काफी आसानी से जोड़ सकते हैं। आदर्श नहीं है, लेकिन एक चुटकी में यह चाल कर देंगे।
रिक स्ट्राल

आपको IObjectContextAdapter डाली की आवश्यकता नहीं है। DbContext, डेटाबेस ऑब्जेक्ट में निर्मित का उपयोग करके sp या कस्टम SQL स्टेटमेंट को संभाल सकता है: संदर्भ। Database.SqlQuery <Dummy> ("sp_GetDummy");
स्टीवन के।

50

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

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

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

उम्मीद है की यह मदद करेगा।


6
BTW, मैंने कुछ दिनों पहले एक ब्लॉग पोस्ट लिखा था जिसमें संग्रहीत प्रक्रियाओं को लागू करने के लिए इन तरीकों का उपयोग करने का विवरण है, यहां तक ​​कि आउटपुट मापदंडों के साथ संग्रहीत प्रक्रियाएं: blogs.msdn.com/b/diego/archive/2012/01/10/…
देवेगा

3
2013 के अंत में, EF6 अभी भी विकास में है। बस तीन साल इंतजार कर रहे हैं स्पार्क्स के लिए समर्थन में सुधार करने के लिए।
डीओके

1
@divega क्या किसी संग्रहीत कार्यविधि से मानों का चयन करने के लिए दृढ़ता से टाइप किया गया समर्थन है - यह कोड-प्रथम दृष्टिकोण ऑब्जेक्ट लाइफ-टाइम को प्रबंधित करने के लिए विशिष्ट लगता है? विशेष रूप से, जटिल खोजों के लिए, TotalRows आउटपुट पैरामीटर के साथ एक 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);

यह लिंक अब सक्रिय नहीं है, लेकिन यहां संग्रह है: web.archive.org/web/20150430090848/http://www.lucbos.net/2012//-
Arturo Torres Sánchez

2

.NET कोर (EntityFrameworkCore) के लिए, मैं उन्हें काम दिलाने में सक्षम रहा हूं।

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

संग्रहीत कार्यविधि जोड़ने के लिए माइग्रेशन इस तरह दिखता है :

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");
        }
    }
}

फिर मैं इसे निम्नलिखित कोड के साथ कॉल कर सकता हूं :

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.