সত্তা ফ্রেমওয়ার্ক কোড কি প্রথমে সঞ্চিত প্রক্রিয়া সমর্থন করে?


112

আমি প্রথম EF কোডের বেশ কয়েকটি উপস্থাপনা দেখেছি এবং EFCF সঞ্চিত পদ্ধতিতে কীভাবে কাজ করে তা দেখিনি।

আমি কীভাবে এমন কোনও পদ্ধতি ঘোষণা করতে পারি যা কিছু এসপি ব্যবহার করবে? আমি কি কোনও পদ্ধতিতে এসিটি পাস করতে পারি যা এসপি পরামিতিগুলিতে ম্যানুয়ালি সত্তার বৈশিষ্ট্যগুলি ম্যাপিং ছাড়াই এসপি কল করে?

এছাড়াও, আমি যদি আমার মডেলটি পরিবর্তন করি তবে কী হবে? মডেল থেকে টেবিল পুনরায় আঁকানোর সময় এটি কি আমার এসপকে ফেলে দেবে? এবং ট্রিগার সম্পর্কে কি?

যদি এই বিষয়গুলি সমর্থন না করা হয়, তবে ভবিষ্যতে তাদের সমর্থন করার কোনও পরিকল্পনা আছে কি?


5
EF রোডম্যাপটি নির্দেশ করে যে EF 6 কোড প্রথমের জন্য সঞ্চিত পদ্ধতি এবং ফাংশনগুলিকে সমর্থন করবে। অ্যান্টিফ্রেমওয়ার্ক.কোড্লেপ্লেক্স
উইকিপেজ?

উত্তর:


66

সম্পাদনা: EF4.1 (নীচে) এর জন্য আমার আসল উত্তরটি এখন পুরানো। দয়া করে নীচে উত্তরটি দিয়েগো ভেগা (মাইক্রোসফ্টে ইএফ দলের সাথে কাজ করে) থেকে দেখুন!


@gsharp এবং শন ম্লেয়ান: আপনি এই তথ্যটি কোথায় পাচ্ছেন? অন্তর্নিহিত অবজেক্ট কনটেক্সটটিতে এখনও আপনার অ্যাক্সেস নেই?

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

"নির্বাচিত" বিবৃতিটি একটি সঞ্চিত প্রকোপের সাথে প্রতিস্থাপন করুন এবং আপনি সেখানে যান।

আপনার অন্যান্য প্রশ্নের মতো: হ্যাঁ, দুর্ভাগ্যক্রমে আপনার এসপি ক্লোবার্ড হয়ে যাবে। আপনার কোডে আপনার "ক্রিয়েট পদ্ধতি" বিবৃতি যুক্ত করতে হতে পারে।

EF 4.2 এর জন্য:

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

ধন্যবাদ। আপনি কি আমাকে কিছু লিঙ্কগুলিতে নির্দেশ করতে পারেন যা এই বিষয় সম্পর্কে আরও তথ্য আছে।
উন্মাদনা

1
আপনি অবজেক্টকন্টেক্সট অবজেক্টে তিনটি এক্সিকিউট ফাংশন সন্ধান করতে চাইবেন (এক্সিকিউটস্টোরকিউরি, এক্সিকিউট ফাংশন এবং এক্সিকিউটস্টোরকম্যান্ড)।
আনন

আমি প্রশ্নটি ভুল বুঝেছি। আমি ভাবছিলাম যে তিনি এসপি'র অনড কোনও কোডটি প্রথম ভিত্তিতে তৈরি করতে চান।
gsharp

আপনি Context.OnModelCreating ওভাররাইড করতে পারেন এবং মোটামুটি সহজেই কোডের মাধ্যমে স্টোরেজ প্রক্সের মতো ডাটাবেস আইটেমগুলি তৈরি করতে কাস্টম লজিক যুক্ত করতে পারেন। আদর্শ নয় তবে এক চিমটিতে এটি কৌশলটি করবে।
রিক স্ট্রহল

আপনার আইওবজেক্ট কনটেক্সটএডাপ্টার কাস্টের দরকার নেই। DbContext স্পট বা কাস্টম এসকিউএল স্টেটমেন্ট হ্যান্ডেল করতে পারে বিল্ট ইন ডাটাবেস অবজেক্ট ব্যবহার করে: প্রসঙ্গ।
স্টিভেন কে।

50

আপডেট: EF6 চালু থেকে, EF কোড প্রথম সন্নিবেশ, আপডেট এবং মুছে ফেলার জন্য সঞ্চিত পদ্ধতি ম্যাপিং সমর্থন করে। আপনি MapToStoredProcedures পদ্ধতি ব্যবহার করে মডেল তৈরির সময় সঞ্চিত পদ্ধতি ম্যাপিং নির্দিষ্ট করতে পারেন। আমরা এই ক্রিয়াকলাপগুলির জন্য বেসিক স্টোরেজ পদ্ধতিগুলির স্বয়ংক্রিয় ভারাজ সমর্থন করি। বৈশিষ্ট্যটির বিশদটি এখানে দেখুন

আসল উত্তর: প্রথম প্রকাশে কোড-ফার্স্টে মডেলটিতে সঞ্চিত পদ্ধতিগুলি ম্যাপিংয়ের জন্য আমাদের কোনও সমর্থন থাকবে না, না আপনার প্রকার থেকে CRUD ক্রিয়াকলাপের জন্য স্বয়ংক্রিয়ভাবে সঞ্চিত পদ্ধতি উত্পন্ন করার উপায় থাকবে। এগুলি এমন বৈশিষ্ট্য যা আমরা ভবিষ্যতে যুক্ত করতে চাই।

যেমনটি এই থ্রেডে উল্লেখ করা হয়েছে, অবজেক্টকন্টেক্সটে ফিরে আসা সম্ভব তবে DbContext দেশীয় এসকিউএল কোয়েরি এবং কমান্ডগুলি চালানোর জন্য দুর্দান্ত এপিআই সরবরাহ করে (যেমন DbSet.SqlQuery, DbContext.Datedia.SqlQuery এবং DbContext.Datbox.ExecuteSqlCommand)। বিভিন্ন স্কেলকিউরি সংস্করণগুলিতে ইফ 4-তে বিদ্যমান একই বেসিক ম্যাটারিয়ালাইজেশন কার্যকারিতা রয়েছে (যেমন এক্সিকিউটস্টোরকিউরি: http://msdn.microsoft.com/en-us/library/dd487208.aspx )।

আশাকরি এটা সাহায্য করবে.


6
বিটিডাব্লু, আমি কিছুদিন আগে একটি ব্লগ পোস্ট লিখেছিলাম যাতে কীভাবে এই পদ্ধতিগুলি সঞ্চিত প্রক্রিয়া, এমনকি আউটপুট প্যারামিটারগুলির সাথে সঞ্চিত পদ্ধতিগুলি কীভাবে ব্যবহার করা যায় সে সম্পর্কে বিস্তারিত জানানো হয়েছে : ব্লগস.এমএসএনএন / বি / ডিয়েগো / আর্কিভ / / / ২০১/
দিভেগা

3
2013 এর শেষ দিকে, EF6 এখনও বিকাশে রয়েছে। তিন বছরের জন্য অপেক্ষা করা কেবলমাত্র স্প্রোকগুলির জন্য সমর্থন উন্নতি করতে, দীর্ঘশ্বাস ফেলুন।
ডেকে

1
@ দিভেগা কি কোনও সঞ্চিত প্রক্রিয়া থেকে কেবল মানগুলি বেছে নেওয়ার জন্য দৃ strongly়ভাবে টাইপ করা সমর্থন রয়েছে - এই কোড-প্রথম পদ্ধতির অবজেক্ট লাইফ-টাইম পরিচালনার জন্য নির্দিষ্ট বলে মনে হচ্ছে? বিশেষত, জটিল অনুসন্ধানগুলির জন্য, একটি টোটালরো আউটপুট প্যারামিটার সহ একটি 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/…
আর্টুরো টরেস সানচেজ

2

.NET কোর (এন্টিফ্রেমওয়ার্ককোর) এর জন্য, আমি সেগুলি কাজ করতে সক্ষম হয়েছি।

সবচেয়ে কাছের নাও হতে পারে তবে এটি অবশ্যই কাজ করে।

মত সঞ্চিত পদ্ধতি সৌন্দর্য যোগ করার জন্য মাইগ্রেশন এই :

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();

পরে সম্পর্কিত কিছু ডেটা (একাধিক সম্পর্কের ডেটা যেমন পোস্টের সামগ্রী হিসাবে) পাওয়ার চেষ্টা করা হয়েছিল এবং ব্লগটি ভরাট পোস্ট সামগ্রীর সাথে এক্সপ্লোর করা হিসাবে ফিরে আসে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.