در نگارشهای پیشین EF امکان استفاده از Stored Procedureها و یا Functionهای SQLایی به صورت Code First وجود نداشت. ولی در نگارش 6.1 آن با استفاده از کتابخانهی EntityFramework.CodeFirstStoreFunctions میتوان آنها را فراخوانی کرد.
ابتدا لازم است که قاعدهی FunctionsConvention را در OnModelCreating به قواعد موجود modelBuilder اضافه کنیم.
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Add(new FunctionsConvention<MyContext>("dbo")); }
سپس به طریق زیر میتوانیم Stored Procedure و Table Value Function را فراخونی نمائیم:
[DbFunction("MyContext", "CustomersByZipCode")] public IQueryable<Customer> CustomersByZipCode(string zipCode) { var zipCodeParameter = zipCode != null ? new ObjectParameter("ZipCode", zipCode) : new ObjectParameter("ZipCode", typeof(string)); return ((IObjectContextAdapter)this).ObjectContext .CreateQuery<Customer>( string.Format("[{0}].{1}", GetType().Name, "[CustomersByZipCode](@ZipCode)"), zipCodeParameter); } public ObjectResult<Customer> GetCustomersByName(string name) { var nameParameter = name != null ? new ObjectParameter("Name", name) : new ObjectParameter("Name", typeof(string)); return ((IObjectContextAdapter)this).ObjectContext. ExecuteFunction<Customer>("GetCustomersByName", nameParameter); }
بدنه SP و TVF استفاده شده به شرح زیر است:
context.Database.ExecuteSqlCommand( "CREATE PROCEDURE [dbo].[GetCustomersByName] @Name nvarchar(max) AS " + "SELECT [Id], [Name], [ZipCode] " + "FROM [dbo].[Customers] " + "WHERE [Name] LIKE (@Name)"); context.Database.ExecuteSqlCommand( "CREATE FUNCTION [dbo].[CustomersByZipCode](@ZipCode nchar(5)) " + "RETURNS TABLE " + "RETURN " + "SELECT [Id], [Name], [ZipCode] " + "FROM [dbo].[Customers] " + "WHERE [ZipCode] = @ZipCode");
چند نکته:
- نوع خروجی تابع باید از <IQueryable<T باشد. T باید از جنسی باشد که معادل EDM آن موجود باشد. T میتواند از انواع اصلی (Primitive) باشد که در EF پشتیبانی میشوند (رجوع شود به Entity Data Model: Primitive Data Types )به طور مثال، int قابل استفاده است ولی uint خیر و یا میتواند از انواع غیر اصلی ( non-primitive ) باشند (enum/complex type/entity type ) که در مدل شما تعریف شدهاند.
- پارامترهای متد باید از نوع اسکالر (primitive یا enum) باشند که قابل map شدن به نوعهای EF باشند.
- نام متد، DbFunction.FunctionName و querystring ایی که به CreateQuery پاس داده میشود باید همگی یکسان باشند.
توضیحات بیشتر در support for SPs TVFs in entityframework 6.1
کد پروژه در CodePlex
نظرات مطالب
EF Code First #15
نمونهای از پیاده سازی اتصال به اوراکل 11g در Entity Framework 6 بوسیله پروایدر تجاری شرکت devart:
تکمیلی: اصول کلی دسترسی به اوراکل به شرح بالاست، ولی نکته مهم مقداردهی به خصیصه Version=X.X.X.X با توجه به نسخه اسمبلی Devart.Data.Oracle.Entity میباشد.
-
ابتدا نسخه آزمایشی dotconnect for oracle 8.2 professional را از این آدرس دریافت و آن را نصب میکنیم.
- نصب آخرین نسخه Entity Framework از طریق پاور شل نیوگت.
- افزودن Devart.Data و Devart.Data.Oracle و Devart.Data.Oracle.Entity به Solution.
- حذف تگ defaultConnectionFactory در entityFramework.
- افزودن تگ زیر در قسمت providers همانند کد زیر:
<provider invariantName="Devart.Data.Oracle" type="Devart.Data.Oracle.Entity.OracleEntityProviderServices, Devart.Data.Oracle.Entity, Version=8.2.100.6, Culture=neutral, PublicKeyToken=09af7300eec23701" />
dotConnect for Oracle
dotConnect for Oracle
بازخوردهای پروژهها
No Entity Framework provider found for the ADO.NET provider
سلام موقع اجرا به من این خطا را میده
توی وب کانفیگ هم به این صورت قید شده
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>
چطور میتونم این را حل کنم؟
نظرات مطالب
EF Code First #1
سلام جناب نصیری
سیلور 5 از code first پشتیبانی نمیکنه ؟ موقع نصب از nuget پیغام میده که
Could not install package 'EntityFramework 4.3.1'. You are trying to install this package into a project that targets 'Silverlight,Version=v5.0', but the package does not contain any assembly references that are compatible with that framework.
در طی این پست ها با مفاهیم NoSql آشنا شدید. همچنین در این دوره
مفاهیم و مبانی RavenDb (یکی از بی نقصترین دیتابیسهای NoSql) بررسی
شد. اما قرار است در طی چند پست با یکی دیگر از انواع دیتابیسهای NoSql
طراحی شده برای دات نت به نام
BrightStarDb یا به اختصار B*Db آشنا شویم.
*در دنیای NoSql پیاده سازیهای متفاوتی از دیتابیسها انجام شده است و هر دیتابیس، ویژگیها و مزایا و معایب خاص خودش را دارد. باید قبول کرد که همیشه و همه جا نمیتوان از یک پایگاه داده NoSql مشخص استفاده نماییم (دلایلی نظیر محدودیتهای License، هزینه پیاده سازی و...). در نتیجه بررسی یک دیتابیس دیگر با شرایط و توانمندیهای خاص آن خالی از سود نیست.
از ویژگی مهم این دیتابیس میتوان به عناوین زیر اشاره کرد.*در دنیای NoSql پیاده سازیهای متفاوتی از دیتابیسها انجام شده است و هر دیتابیس، ویژگیها و مزایا و معایب خاص خودش را دارد. باید قبول کرد که همیشه و همه جا نمیتوان از یک پایگاه داده NoSql مشخص استفاده نماییم (دلایلی نظیر محدودیتهای License، هزینه پیاده سازی و...). در نتیجه بررسی یک دیتابیس دیگر با شرایط و توانمندیهای خاص آن خالی از سود نیست.
» این دیتاییس در گروه Graph databasesها قرار دارد و از زبان SPARQL (بخوانید Sparkle) برای کوئری گرفتن و کار با دادهها بهره میبرد؛
» متن باز و رایگان است
» پشتیبانی از دات نت چهار به بعد؛
» قابل استفاده در Mobile Application - Windows phone 7 , 8؛
» بدون شما (Schema Less) و با قابیلت ذخیره سازی triple و به فرمت RDF
» پشتیبانی از Linq و OData؛
» پشتیبانی از تراکنشها ؛
» پیاده سازی مدل برنامه به صورت Code First؛
» سرعت بالا جهت ذخیره سازی و لود اطلاعات؛
» نیاز به پیکربندیهای خاص جهت پیاده سازی ندارد؛
» ارائه افزونه رایگان Polaris جهت کوئری گفتن و نمایش Visual داده ها.
و غیره که در ادامه با آنها آشنا خواهید شد.
در B*Db دو روش برای ذخیره سازی اطلاعات وجود دارد:
» Append Only : در این روش تمامی تغییرات (عملیات نوشتن) در انتهای فایل index اضافه خواهد شد. این روش مزایای زیر را به دنبال خواهد داشت:
- عملیات نوشتن هیچگاه عملیات خواندن اطلاعات را block نمیکند. در
نتیجه هر تعداد عملیات خواندن فایل (منظور اجرای کوئریهای SPQRL است) میتواند به صورت موازی بر روی Storeها اجرا شود.
- به دلیل اینکه عمل ویرایش واقعی هیچ گاه انجام نمیشود (دادهها فقط اضافه خواهند شد) همیشه میتوانید وضعیت Store را به حالتهای قبلی بازگردانید.
- عملیات نوشتن اطلاعات بسیار سریع خواهد بود.
» Rewritable : در این روش در
هنگام اجرای عملیات نوشتن، ابتدا یک کپی از اطلاعات گرفته میشود. سپس دادههای مورد نظر به کپی گرفته شده اعمال میشوند. تا زمانیکه عملیات نوشتن
اطلاعات به پایان نرسد، هر گونه دسترسی به اطلاعات جهت عملیات Read بر روی
داده اصلی اجرا میشود. با استفاده از این روش عملیات Read و Write هیچ
گونه تداخلی با هم نخواهند داشت. (چیزی شبیه به ^)
نکته ای که باید به آن دقت داشت این است که فقط در هنگام ساخت Storeها میتوانید نوع ذخیره سازی آن را تعیین نمایید، بعد از ساخت Store امکان سوئیچ بین حالات امکان پذیر نیست.
نکته ای که باید به آن دقت داشت این است که فقط در هنگام ساخت Storeها میتوانید نوع ذخیره سازی آن را تعیین نمایید، بعد از ساخت Store امکان سوئیچ بین حالات امکان پذیر نیست.
همان طور که پیشتر گفته شد B*Db برای ذخیره سازی اطلاعات از سند RDF بهره میبرد. البته با RDF Syntaxهای متفاوت :
هم چنین در B*Db چهار روش برای دست یابی با دادهها (پیاده سازی عملیات CRUD) وجود دارد از قبیل:
» B*Db EntityFramewok
» Data Object Layer
» RDF Client Api
» Dynamic API
که هر کدام در طی پستهای متفاوت بررسی خواهد شد.
بررسی یک مثال با روش B*Db EntityFramework
برای شروع ابتدا یک پروژه جدید از نوع Console Application ایجاد کنید. سپس از طریق Nuget اقدام به نصب Package زیر نمایید:
pm> install-Package BirghtStarDb
PM> Install-Package BirghtStarDbLibs
این پکیج فقط شامل کتابخانههای لازم جهت کار با استفاده از SPRQL است.
بعد از نصب پکیجهای بالا یک فایل Text Template با نام MyEntityContext.tt نیز به پروژه افزوده خواهد شد. این فایل جهت تولید خودکار مدلهای برنامه استفاده میشود. اما برای این کار لازم است به ازای هر مدل ابتدا یک اینترفیس ایجاد نمایید. برای مثال:
بعد از نصب پکیجهای بالا یک فایل Text Template با نام MyEntityContext.tt نیز به پروژه افزوده خواهد شد. این فایل جهت تولید خودکار مدلهای برنامه استفاده میشود. اما برای این کار لازم است به ازای هر مدل ابتدا یک اینترفیس ایجاد نمایید. برای مثال:
[Entity] public interface IBook { public int Code { get; set; } public string Title { get; set; } }
» نیاز به ایجاد یک خاصیت به عنوان Id وجود ندارد. به صورت پیش فرض خاصیت Id با نوع string برای هر مدل پیاده سازی میشود. اما اگر قصد دارید این نام خاصیت را تغییر دهید میتوانید به صورت زیر عمل کنید:
[Entity] public interface IBook { [Identifier] public string MyId { get; } public int Code { get; set; } public string Title { get; set; } }
استفاده از اینترفیس برای ساخت مدل انعطاف پذیری بالایی را در اختیار ما قرار میدهد که بعدا مفصل بحث خواهد شد. برای عملیات درج داده میتوان به صورت زیر عمل کنید:
MyEntityContext context = new MyEntityContext("type=embedded;storesdirectory=c:\brightstar;storename=test"); var book = context.Books.Create(); book.Code = 1; book.Title = "Test"; context.Books.Add(book); context.SaveChanges();
»embedded : در این حالت از طریق آدرس فیزیکی فایل مورد نظر میتوان یک Connection ایجاد کرد.
»rest : یا استفاده از HTTP یا HTTPS میتوان به سرویس B*Db دسترسی داشت.
»dotNetRdf : برای ارتباط با یک Store دیگر با استفاده از اتصال دهندههای DotNetRDf.
»sparql : اتصال به منبع داده ای دیگر با استفاده از پروتکل SPARQL
در هنگام ایجاد اتصال باید نوع مورد نظر را از حتما تعیین نمایید. با استفاده از storedirctory مکان فیزیکی فایل تعیین خواهد شد.
اشتراکها
OData برای SQL Server 2012
- Updated Roslyn to
3.8.0
, MSBuild to16.8.0
, DotNetHostResolver to5.0.0
, Nuget packages to5.8.0-rc.6930
and MSBuildSDKResolver to5.0.101-servicing.20564.2
to match .NET 5.0.100 SDK (PR: omnisharp-vscode#2015, omnisharp-vscode#2016)
اشتراکها
5 Angular منتشر شد
We are pleased to announce version 5.0.0 of Angular, pentagonal-donut. This is a major release containing new features and bugfixes. This release continues our focus on making Angular smaller, faster, and easier to use.
پاسخ به بازخوردهای پروژهها
پکیج های ناهماهنگ بعد از restore
اگر پکیجهای پروژه رو آپدیت کنیم مشکلی پیش نمیاد ؟
زمانی که آپدیت کردم خطای زیر رو گرفتم
زمانی که آپدیت کردم خطای زیر رو گرفتم
Severity Code Description Project File Line Suppression State
Error Unable to resolve dependencies. 'Microsoft.AspNet.Mvc 5.2.3' is not compatible with 'MvcSiteMapProvider.MVC4.Core 4.6.22 constraint: Microsoft.AspNet.Mvc (>= 4.0.0 && < 5.0.0)', 'T4MVCExtensions 4.0.0 constraint: Microsoft.AspNet.Mvc (>= 5.2.3)'. 0