اشتراکها
اشتراکها
تغییر نام رسمی ASP.NET 5 و EF 7
اشتراکها
آموزش EF Core
تغییراتی در Entity framework 6 صورت گرفته و در ذیل لیستی از موارد آن آمده است. همچنین پیشتر در همین سایت نیز به آنها اشارهای شده که باز تولید پروایدرها برای نسخه جدید Entity framework یکی از آنها میباشد:
اکنون برای بهروز رسانی به نسخه جدید، جهت ادامه استفاده از SqlServer Compact مواردی باید لحاظ شود که به آنها اشاره خواهیم کرد و قبل از آنها رعایت یک سری از پیشنیازها لازم است. برای مثال در وب کانفیگ برای استفاده از پروایدر SqlServer Compact بعنوان پروایدر پیش فرض باید قسمت مربوطه را به نحو ذیل تغییر داده باشیم:
حالا در کنسول نیوگت دستور زیر را برای بهروزرسانی فقط Entity Framework وارد و اجرا میکنیم:
و نیز تاییدی برای اعمال تغییرات بهروز رسانی Entity framework انجام میشود تا فایل کانفیگ پروژه را تغییر دهد:
بعد از بهروز رسانی Entityframework باید پکیج EntityFramework.SqlServerCompact برای ادامه استفاده از پروایدر نصب شود که با دستور نیوگت زیر این امر نیز میسر است:
Rebuilding EF Providers for EF6 Updating Applications to use EF6 EF Tools: adding EF6 support & enabling out-of-band releases Async Query and Save Connection Resiliency Code-Based Configuration Dependency Resolution Interception/SQL logging Custom implementations of Equals or GetHashCode on entity classes Custom Code First Conventions Code First Mapping to Insert/Update/Delete Stored Procedures Configurable Migrations History Table Multiple Contexts per Database
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework"> <parameters> <parameter value="System.Data.SqlServerCe.4.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" /> </providers> </entityFramework>
Update-Package EntityFramework
پیغام موفقیت آمیز بودن بهروز رسانی در خروجی نیوگت ظاهر میشود
این تغییرات شامل موارد ذیل میباشند (در صورت بهروز رسانی دستی، منظور کپی پکیج بصورت دستی، اعمال تغییرات در کانفیگها مورد نیاز است):
<!-- 1. Change in <configuration><configSections> --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- 2. Add in <entityFramework><providers> --> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
PM> Install-Package EntityFramework.SqlServerCompact
حالا بدون مشکل میتوان از پروژه بیلد گرفت و کار توسعه را ادامه داد.
We recently published a BenchmarkDotNet-based benchmark on GitHub: https://github.com/DevExpress/XpoNetCoreDemos/tree/master/ORMBenchmark.
We used it to test the performance of the following Object-Relational Mapping (ORM) libraries for .NET Framework 4.6.1 and higher:
- Entity Framework 6.0.2 (EF 6);
- Entity Framework Core 2.0.3 (EF Core);
- eXpress Persistent Objects™ 18.1.3 (XPO).
Entity Framework Core 2.0 introduces global query filters that can be applied to entities when a model is created. It makes it easier to build multi-tenant applications and support soft deleting of entities. This blog post gives a deeper overview of how to use global query filters in real-life applications and how to apply global query filters to domain entities automatically.
من قصد پیاده سازی یک صفحه برای جستجوی پیشرفته بین همه جداول رو دارم. برای این کار یک کلاس تعریف کردم و در ورودی تابع یک لیست از این نوع را بهش پاس میدم. این کلاس اینطور تعریف شده:
کاربر اسم جدول و اون ستونی که میخواد شرط رو براش اعمال کنه رو انتخاب میکنه و بعدش عبارت یا محدوده تاریخ رو وارد میکنه. این که شامل بشه یا نشه رو هم با Include میتونه مشخص کنه.
آیا اینکار با gridify امکان پذیر میباشد؟
public class SearchDTO { public string TableName { get; set; } public string ColumnName { get; set; } public string searchPhrase { get; set; } = string.Empty; public DateTimeOffset? searchDateFrom { get; set; } public DateTimeOffset? searchDateTo { get; set; } public int Include { get; set; } = 1; }
من هر چی داکومنت رو خوندم توی همشون اسم جدول رو نمیشد به صورت string وارد کرد. اگه اشتباه میکنم لطفا اصلاح کنید.
رویه ای که مدنظرم هست اینه که داخل یه حلقه for یا foreach یک کوئری بنویسم که همهی جداولی که کاربر انتخاب کرده رو با هم join کنه. بعدش توی یه حلقه دیگه شرطها رو روی ستون هایی که انتخاب کرده اعمال کنم.
در نهایت ستونهای نتیحه نهایی رو Select کنم تا اون ستون هایی که مجاز هستند به سمت کلاینت برگشت داده بشه. اسامی این ستونها رو توی یه فایل .resx ذخیره کردم.
یعنی یه چیزی شبیه به این کد:(ولی این کد درست و قابل اجرا نیست)
// Join the tables dynamically based on the table names for (int i = 1; i < filterList.Count; i++) { var joinEntityType = entityTypes.FirstOrDefault(t => t.ClrType.Name == filterList[0].TableName)?.ClrType; if (entityType == null) { return (null, 0, 0); } var joinEntityQuery = (IQueryable<object>)Activator.CreateInstance(typeof(DbSet<>).MakeGenericType(joinEntityType), _dbContext); query = query.Join(joinEntityQuery.ToList(), x => x.GetType().GetProperty($"{filterList[i - 1].TableName}.{filterList[i - 1].TableName}Id").GetValue(x), y => y.GetType().GetProperty($"{filterList[i].TableName}.{filterList[i].TableName}Id").GetValue(y), (x, y) => x); } // Apply the conditions dynamically based on the column names and conditions for (int i = 0; i < filterList.Count; i++) { if (!string.IsNullOrEmpty(filterList[i].searchPhrase)) { var parameter = Expression.Parameter(entityType, "x"); var condition = Expression.Call( typeof(string).GetMethod("Contains", new[] { typeof(string) }), Expression.PropertyOrField(parameter, filterList[i].ColumnName), Expression.Constant(filterList[i].searchPhrase) ); var lambda = Expression.Lambda<Func<object, bool>>(condition, parameter); query = query.Where(lambda); } if (filterList[i].searchDateFrom.HasValue) { //must write expression for date constraint } } // Select the specified columns dynamically ResourceManager resourceManager = new ResourceManager(typeof(TablePropertiesResources)); var columnNames = resourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true) .OfType<DictionaryEntry>() .Select(entry => entry.Key.ToString()) .ToList(); var selectColumns = columnNames.ToArray(); var selectedData = query .Select(x => new { // Dynamically select the desired properties Result = selectColumns.ToDictionary(column => column, column => x.GetType().GetProperty(column).GetValue(x)) }) .ToList();