پروژه با EF 6 نیست و نیاز به به روز رسانی داره اگر از EF 6 میخواهید استفاده کنید: ارتقاء به Entity framework 6 و استفاده از بانکهای اطلاعاتی غیر از SQL Server
در این مخزن روشهای بهینه و توصیه شده جهت ساخت برنامههای تحت وب با استفاده از Net Core. در قالب 12 پروژه پیاده سازی شده است که منبع خوبی جهت الگو برداری است.
Boilerplate for ASP.NET Core reference application with Entity Framework Core, demonstrating a layered application architecture with DDD best practices. Implements NLayer Hexagonal architecture (Core, Application, Infrastructure and Presentation Layers) and Domain Driven Design (Entities, Repositories, Domain/Application Services, DTO's...) and aimed to be a Clean Architecture, with applying SOLID principles in order to use for a project template. Also implements best practices like loosely-coupled, dependency-inverted architecture and using design patterns such as Dependency Injection, logging, validation, exception handling, localization and so on.
آموزش کار با Razor pages
رمزنگاری و رمز گذاری مقادیر تنظیمات برنامه در ASP.NET CORE
پیش نیازها :
ارتقاء به ASP.NET Core 1.0 - قسمت 7 - کار با فایلهای config
ذخیره سازی تنظیمات برنامههای ASP.NET Core در بانک اطلاعاتی به کمک Entity Framework Core
create table Employees ( Id int auto_increment primary key, FirstName text null, LastName text null, DateOfBirth timestamp not null );
public class Employee { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTimeOffset DateOfBirth { get; set; } } public class MyDbContext : DbContext { public DbSet<Employee> Employees { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) { options.UseMySQL(_configuration.GetConnectionString("DataConnection")); } }
اما در مدل EAV، خواص داینامیک را به درون جدول دومی منتقل خواهیم کرد:
create table EmployeeEav ( Id int auto_increment primary key ); create table EmployeeAttributes ( Id int auto_increment primary key, EmployeeId int not null, AttributeName text null, AttributeValue text null, constraint FK_EmployeeAttributes_EmployeeEav_EmployeeId foreign key (EmployeeId) references EmployeeEav (Id) on delete cascade ); create index IX_EmployeeAttributes_EmployeeId on EmployeeAttributes (EmployeeId);
تعریف جداول فوق نیز در Entity Framework به اینصورت خواهند بود:
public class EmployeeEav { public int Id { get; set; } public virtual ICollection<EmployeeAttribute> Attributes { get; set; } } public class EmployeeAttribute { public int Id { get; set; } public virtual EmployeeEav Employee { get; set; } public int EmployeeId { get; set; } public string AttributeName { get; set; } public string AttributeValue { get; set; } } public class MyDbContext : DbContext { public DbSet<EmployeeEav> EmployeeEav { get; set; } public DbSet<EmployeeAttribute> EmployeeAttributes { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) { options.UseMySQL(_configuration.GetConnectionString("DataConnection")); } }
- کوئری گرفتن در این روش سخت است
SELECT `e`.`Id`, `e`.`DateOfBirth`, `e`.`FirstName`, `e`.`LastName` FROM `Employees` AS `e` WHERE `e`.`DateOfBirth` > @__endDate_0
var endDate = DateTimeOffset.Now.AddYears(Convert.ToInt32(-25)); var normalTypes = dbContext.Employees.Where(x => x.DateOfBirth > endDate).ToList();
SELECT MAX(CASE AttributeName WHEN 'FirstName' THEN AttributeValue END) AS FirstName, MAX(CASE AttributeName WHEN 'LastName' THEN AttributeValue END) AS LastName, MAX(CASE AttributeName WHEN 'DateOfBirth' THEN AttributeValue END) AS DateOfBirth FROM efcoresample.EmployeeAttributes WHERE EmployeeId IN (SELECT EmployeeId FROM efcoresample.EmployeeAttributes WHERE AttributeName = 'DateOfBirth' AND AttributeValue > DATE_SUB(CURRENT_DATE(), INTERVAL 25 YEAR)) AND AttributeName IN ('FirstName', 'LastName', 'DateOfBirth') GROUP BY EmployeeId;
string[] columnNames = {"FirstName", "LastName", "DateOfBirth"}; var employees = dbContext.EmployeeAttributes .Where(x => dbContext.EmployeeAttributes .Where(i => i.AttributeName == "DateOfBirth") .Select(eId => eId.EmployeeId).Contains(x.EmployeeId) && columnNames.Contains(x.AttributeName)) .GroupBy(x => x.EmployeeId) .Select(g => new { FirstName = g.Max(f => f.AttributeName == "FirstName" ? f.AttributeValue : ""), LastName = g.Max(f => f.AttributeName == "LastName"? f.AttributeValue : ""), DateOfBirth = g.Max(f => f.AttributeName == "DateOfBirth"? f.AttributeValue : ""), Id = g.Key }) .ToList() .Where(x => DateTime.ParseExact(x.DateOfBirth, "yyyy-MM-dd", CultureInfo.InvariantCulture) > DateTime.Now.AddYears(-25));
- امکان تعریف فیلدهای اجباری را نخواهیم داشت
- امکان تعیین نوع ستونها را نخواهیم داشت
- امکان تعریف کلیدهای خارجی را نخواهیم داشت
در EF 6 نسخه بتا، متدی اضافه شده به نام AddRange که افزودن تعداد زیادی رکورد رو سهولت بخشیده
INSERTing many rows with Entity Framework 6 beta 1 and SQL Server Compact
آشنایی با NHibernate - قسمت هشتم
لینک زیر نحوه ترکیب Repository با EF رو توضیح داده که البته ادامه داره و در پست های بعدی مطلب رو تکمیل و به روز کرده
http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/
using Microsoft.Data.Entity; using Microsoft.Data.Entity.Metadata; using System.Collections.Generic; using System.Linq; namespace UsingEF7WithSQLite { public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } } }
PM> Install-Package EntityFramework.SQLite –Pre
namespace UsingEF7SQLiteProvider { public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnConfiguring(DbContextOptions builder) { builder.UseSQLite(@"Data Source=.\BloggingDatabae.db"); } protected override void OnModelCreating(ModelBuilder builder) { builder.Entity<Blog>() .OneToMany(b => b.Posts, p => p.Blog) .ForeignKey(p => p.BlogId); // The EF7 SQLite provider currently doesn't support generated values // so setting the keys to be generated from developer code builder.Entity<Blog>() .Property(b => b.BlogId) .GenerateValueOnAdd(false); builder.Entity<Post>() .Property(b => b.BlogId) .GenerateValueOnAdd(false); } } }
Install-Package EntityFramework.Commands -Pre
Add-Migration MyFirstMigration Apply-Migration
using (var db = new BloggingContext()) { db.Database.AsMigrationsEnabled().ApplyMigrations(); }
using (var db = new Models.BloggingContext()) { db.Blogs.Add(new Models.Blog { Url = "https://www.dntips.ir" }); db.SaveChanges(); foreach (var item in db.Blogs) { Console.WriteLine(item.Url); } } Console.ReadLine();