重點講 Entity Framework Core !html
(一)Entity Framework數據庫
它是適用於.NET 的對象關係映射程序 (ORM),如今的EF6已是久經沙場,並經歷重重磨難,得到一致承認的數據訪問技術(原來加 Title 也挺有意思的,哈哈哈)。框架
做爲 ORM,EF6 下降了關係方面和麪向對象的方面之間的阻抗不匹配,使開發人員可以使用表示應用程序域的強類型 .NET 對象來編寫應用程序,該應用程序可與存儲在關係數據庫中的數據交互,同時使開發人員無需再編寫大部分的數據訪問「管道」代碼。這是微軟官方吹牛逼的原話,但也很好理解。ide
那基於 EF6 能夠實現不少 ORM 的熱門的一些功能: 工具
相信不少人都使用過 VS 中 EF 設計器,我之前用得比較多,主要就是在項目中建立的:性能
項目->添加新項...ui
選擇數據左側的菜單,而後ADO.NET 實體數據模型;spa
用生成的 Model 做爲名稱,而後單擊肯定;設計
這將啓動實體數據模型嚮導;3d
選擇從數據庫生成單擊下一步;
再單擊表導入的全部表並單擊完成旁邊的複選框,點擊完成。
反向工程過程完成後,新的模型就添加到了項目,並直接打開了實體框架設計器
那麼如今已經建立完了實體模型。在建立的過程中,已經幫咱們建好了數據類型,生成了表的映射還有存儲過程的映射,這賊爽了,點幾下就搞定了,接着就能夠進行增刪改查了(具體怎麼作,這裏就不詳解了)。
EF設計器中,咱們一樣能夠操做表,更新表的字段,再經過正向工程,能夠更新數據庫中的表。
PS:使用 Code First 生成的實體,比EF設計器生成的要乾淨,可是也失去了正向工程的功能。
(二)Entity Framework Core
它是輕量化、可擴展、開源和跨平臺版的經常使用 Entity Framework 數據訪問技術。可用做對象關係映射程序 (ORM),以便於 .NET 開發人員可以使用 .NET 對象來處理數據庫,這樣就沒必要常常編寫大部分數據訪問代碼了。
EF Core 則徹底進行了重寫,包含許多 EF6 沒有的新功能,但仍是缺乏 EF6 中最高級的一些映射功能。
那若是要經過 VS 進行反向工程的話,須要安裝 PMC 工具,並且這個工具是僅限於VS使用的。固然也還有一些很是棒的代碼生成工具,好比 Code Smith。
使用PMC生成實體過程:
打開VS的程序包管理控制檯
在程序包管理器控制檯(PMC)工具中使用命令 Scaffold-DbContext 來進行反向工程。
Scaffold - DbContext 'Data Source=.;Initial Catalog=Library;integrated security=true' Microsoft.EntityFrameworkCore.SqlServer
當出入命名直接回車後,會在項目的根目錄下生成文件。固然,你也能夠在 Scaffold-DbContext 命令中加入指定的生成路徑等設置命令的。
這個跟用EF中用 Code First 生成文件是一個毛樣的結果。下圖就是 Code First 生成的。
固然,他們生成的代碼仍是有區別的。咱們來看看 Scaffold-DbContext 命令生成的三個文件的代碼:
一、LibraryContext.cs
public partial class LibraryContext : DbContext { public LibraryContext() { } public LibraryContext(DbContextOptions<LibraryContext> options) : base(options) { } public virtual DbSet<Books> Books { get; set; } public virtual DbSet<Categories> Categories { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=Library;integrated security=true"); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasAnnotation("ProductVersion", "2.2.3-servicing-35854"); modelBuilder.Entity<Books>(entity => { entity.ToTable("books"); entity.Property(e => e.Id) .HasColumnName("id") .ValueGeneratedNever(); entity.Property(e => e.Author) .IsRequired() .HasColumnName("author") .HasMaxLength(50); entity.Property(e => e.Cateid).HasColumnName("cateid"); entity.Property(e => e.Createtime) .HasColumnName("createtime") .HasColumnType("datetime"); entity.Property(e => e.Isdel).HasColumnName("isdel"); entity.Property(e => e.Name) .IsRequired() .HasColumnName("name") .HasMaxLength(50); entity.HasOne(d => d.Cate) .WithMany(p => p.Books) .HasForeignKey(d => d.Cateid) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_books_categories"); }); modelBuilder.Entity<Categories>(entity => { entity.ToTable("categories"); entity.Property(e => e.Id) .HasColumnName("id") .ValueGeneratedNever(); entity.Property(e => e.Cascadeid) .IsRequired() .HasColumnName("cascadeid") .HasMaxLength(20); entity.Property(e => e.Createtime) .HasColumnName("createtime") .HasColumnType("datetime"); entity.Property(e => e.Fid).HasColumnName("fid"); entity.Property(e => e.Isdel).HasColumnName("isdel"); entity.Property(e => e.Name) .IsRequired() .HasColumnName("name") .HasMaxLength(50); }); } }
二、Categories.cs
public partial class Categories { public Categories() { Books = new HashSet<Books>(); } public int Id { get; set; } public int Fid { get; set; } public string Name { get; set; } public string Cascadeid { get; set; } public DateTime Createtime { get; set; } public bool Isdel { get; set; } public virtual ICollection<Books> Books { get; set; } }
三、Books.cs
public partial class Books { public int Id { get; set; } public int Cateid { get; set; } public string Name { get; set; } public string Author { get; set; } public DateTime Createtime { get; set; } public bool Isdel { get; set; } public virtual Categories Cate { get; set; } }
經過上面能夠看到,它們已經生成好了映射。可是,若是要映射存儲過程的話,EF Core 是不支持的。
(三)它們的區別
EF Core 提供了在 EF6 中不會實現的新功能(如備選鍵、批量更新以及 LINQ 查詢中的混合客戶端/數據庫評估。 但因爲它是一個新代碼庫,因此會缺乏一些 EF6 中的功能。這也是正常的,可是它還在不斷的完善!
EF Core 是更現代、可擴展的輕量級實體框架版本,與 EF6 的功能和優勢很是類似。若是功能與需求都匹配的話,能夠優先考慮使用 EF Core 的。至少性能擺在那裏!
下面引用官方的圖片,展現它們在功能上的比較:
原文出處:https://www.cnblogs.com/Vam8023/p/10778511.html