日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.net core Entity Framework 与 EF Core

發(fā)布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net core Entity Framework 与 EF Core 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

重點講?Entity Framework Core !

(一)Entity Framework

? ? ? ? ? ?它是適用于.NET 的對象關(guān)系映射程序 (ORM),現(xiàn)在的EF6已經(jīng)是久經(jīng)沙場,并經(jīng)歷重重磨難,獲得一致認可的數(shù)據(jù)訪問技術(shù)(原來加 Title 也挺有意思的,哈哈哈)。

? ? ? ? ? ?作為 ORM,EF6 降低了關(guān)系方面和面向?qū)ο蟮姆矫嬷g的阻抗不匹配,使開發(fā)人員能夠使用表示應(yīng)用程序域的強類型 .NET 對象來編寫應(yīng)用程序,該應(yīng)用程序可與存儲在關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)交互,同時使開發(fā)人員無需再編寫大部分的數(shù)據(jù)訪問“管道”代碼。這是微軟官方吹牛逼的原話,但也很好理解。

? ? ? ? ? ?那基于 EF6 可以實現(xiàn)很多 ORM 的熱門的一些功能:? ??

    • 不依賴于任何 EF 類型的 POCO (Plain Old CLR Object) 實體類的映射
    • 自動更改跟蹤
    • 標識解析和工作單元
    • 預(yù)先、延遲和顯式加載
    • 使用 LINQ(語言集成查詢)轉(zhuǎn)換強類型查詢
    • 豐富的映射功能,可支持:
      • 一對一、一對多和多對多關(guān)系
      • 繼承(每個層次結(jié)構(gòu)一張表、每個類型一張表和每個具體類一張表)
      • 復(fù)雜類型
      • 存儲過程
    • 通過可視化設(shè)計器創(chuàng)建實體模型。
    • 通過編寫代碼創(chuàng)建實體模型的“Code First”體驗。
    • 既可從現(xiàn)有數(shù)據(jù)庫生成模型,然后手動編輯,也可從頭開始創(chuàng)建模型,然后用于生成新的數(shù)據(jù)庫。
    • 與 .NET Framework 應(yīng)用程序模型(包括 ASP.NET)集成,并通過數(shù)據(jù)綁定與 WPF 和 WinForms 集成。
    • 基于 ADO.NET 的數(shù)據(jù)庫連接和可用于連接到 SQL Server、Oracle、MySQL、SQLite、PostgreSQL、DB2 等的眾多提供程序。

? ? ? ? ? ?相信很多人都使用過 VS 中 EF 設(shè)計器,我以前用得比較多,主要就是在項目中創(chuàng)建的:

    • 項目->添加新項...

    • 選擇數(shù)據(jù)左側(cè)的菜單,然后ADO.NET 實體數(shù)據(jù)模型;

    • 用生成的?Model?作為名稱,然后單擊確定;

    • 這將啟動實體數(shù)據(jù)模型向?qū)?#xff1b;

    • 選擇從數(shù)據(jù)庫生成單擊下一步;

    • 選擇連接到第一個部分中創(chuàng)建的數(shù)據(jù)庫中,直接用生成的 LibraryEntities?作為名稱的連接字符串和單擊下一步;

    • 選擇好實體框架 6.x ,下一步;

    • 再單擊表導(dǎo)入的所有表并單擊完成旁邊的復(fù)選框,點擊完成。

    • 反向工程過程完成后,新的模型就添加到了項目,并直接打開了實體框架設(shè)計器

?

? ? ? ? ? ? 那么現(xiàn)在已經(jīng)創(chuàng)建完了實體模型。在創(chuàng)建的過程當(dāng)中,已經(jīng)幫我們建好了數(shù)據(jù)類型,生成了表的映射還有存儲過程的映射,這賊爽了,點幾下就搞定了,接著就可以進行增刪改查了(具體怎么做,這里就不詳解了)。

? ? ? ? ? ? EF設(shè)計器中,我們同樣可以操作表,更新表的字段,再通過正向工程,可以更新數(shù)據(jù)庫中的表。

? ? ? ? ? ? PS:使用 Code First 生成的實體,比EF設(shè)計器生成的要干凈,但是也失去了正向工程的功能。

(二)Entity Framework Core

? ? ? ? ? ?它是輕量化、可擴展、開源和跨平臺版的常用 Entity Framework 數(shù)據(jù)訪問技術(shù)。可用作對象關(guān)系映射程序 (ORM),以便于 .NET 開發(fā)人員能夠使用 .NET 對象來處理數(shù)據(jù)庫,這樣就不必經(jīng)常編寫大部分數(shù)據(jù)訪問代碼了。

? ? ? ? ? ?EF Core 則完全進行了重寫,包含許多 EF6 沒有的新功能,但還是缺少 EF6 中最高級的一些映射功能。

? ? ? ? ? ?那如果要通過 VS 進行反向工程的話,需要安裝 PMC 工具,而且這個工具是僅限于VS使用的。當(dāng)然也還有一些非常棒的代碼生成工具,比如 Code Smith。

? ? ? ? ? ?使用PMC生成實體過程:

    • 打開VS的程序包管理控制臺

    • 在程序包管理器控制臺(PMC)工具中使用命令 Scaffold-DbContext 來進行反向工程。

Scaffold - DbContext 'Data Source=.;Initial Catalog=Library;integrated security=true' Microsoft.EntityFrameworkCore.SqlServer

? ? ? ? ? ?當(dāng)出入命名直接回車后,會在項目的根目錄下生成文件。當(dāng)然,你也可以在 Scaffold-DbContext 命令中加入指定的生成路徑等設(shè)置命令的。

? ? ? ? ? ? 這個跟用EF中用 Code First 生成文件是一個毛樣的結(jié)果。下圖就是 Code First 生成的。

? ? ? ? ? ? 當(dāng)然,他們生成的代碼還是有區(qū)別的。我們來看看?Scaffold-DbContext 命令生成的三個文件的代碼:

? ? ? ? ? ?1、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);});}}

? ? ? ? ? ?2、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; }}

? ? ? ? ? ?3、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; }}

? ? ? ? ? ? 通過上面可以看到,它們已經(jīng)生成好了映射。但是,如果要映射存儲過程的話,EF Core 是不支持的。

?(三)它們的區(qū)別

? ? ? ? ? ??EF Core 提供了在 EF6 中不會實現(xiàn)的新功能(如備選鍵、批量更新以及 LINQ 查詢中的混合客戶端/數(shù)據(jù)庫評估。 但由于它是一個新代碼庫,所以會缺少一些 EF6 中的功能。這也是正常的,但是它還在不斷的完善!

? ? ? ? ? ??EF Core 是更現(xiàn)代、可擴展的輕量級實體框架版本,與 EF6 的功能和優(yōu)點非常相似。如果功能與需求都匹配的話,可以優(yōu)先考慮使用 EF Core 的。至少性能擺在那里!

? ? ? ? ? ? 下面引用官方的圖片,展示它們在功能上的比較:

?

轉(zhuǎn)載于:https://www.cnblogs.com/Vam8023/p/10778511.html

總結(jié)

以上是生活随笔為你收集整理的.net core Entity Framework 与 EF Core的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。