.NET Core開發日誌——Entity Framework與PostgreSQL
Entity Framework在.NET Core中被命名為Entity Framework Core。雖然一般會用於對SQL Server資料庫進行資料操作,但其實它還支援其它資料庫,這裡就以PostgreSQL作為例子。
PostgreSQL
PostgreSQL可以選用原生系統與Docker兩種安裝方式。
Package
在應用程式工程中新增相關的引用。
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
Entity
編寫兩個實體類,用於對映User表與Order表。
public class User { [Key] public int Id { get; set; } [Required] public string Name { get; set; } public virtual ICollection<Order> Orders { get; set; } public override string ToString() { var orders = new StringBuilder(); foreach (var o in Orders) { orders.Append(o.ToString()); } return $"UserId: {Id} Name: {Name} Orders: {orders.ToString()}"; } }
public class Order { [Key] public int Id { get; set; } [Required] public int UserId { get; set; } [Required] public string Item { get; set; } [Required] public string Description { get; set; } public virtual User User { get; set; } public override string ToString() { return $"OrderId: {Id} Item: {Item} Descriptoin: {Description}"; } }
DbContext
構建必要的DbContext類,並傳入連線PostgreSQL所需的引數。
public class PurchaseDbContext : DbContext { public DbSet<User> Users { get; set; } public DbSet<Order> Orders { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder builder) { builder.UseNpgsql("Host=localhost;Username=postgres;Password=random;Database=Purchase"); } }
Seeder
構建一個用於初始化資料庫的輔助類。
public class PurchaseDbContxtSeeder { public static void Seed(PurchaseDbContext context) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); var users = new List<User> { new User { Name = "Tom" }, new User { Name = "Mary" } }; var orders = new List<Order> { new Order { User = users[0], Item = "cloth", Description = "handsome"}, new Order {User = users[1], Item = "hat", Description = "red"}, new Order {User = users[1], Item = "boot", Description = "black"} }; context.Users.AddRange(users); context.Orders.AddRange(orders); context.SaveChanges(); } }
Test
測試的程式第一步是呼叫生成資料的輔助類,第二步是查詢資料表中的資料並在控制檯中顯示出來。
static void Main(string[] args) { using (var context = new PurchaseDbContext()) { PurchaseDbContxtSeeder.Seed(context); var users = context.Users.Include(u => u.Orders).ToList(); users.ForEach(u => { System.Console.WriteLine(u); }); } }
以下是顯示的結果:
程式正常執行的話,資料庫中應該可以看到所生成的資料表:
再檢視資料表的生成指令碼,可以看到欄位以及表之間的關係皆通過Entity Framework自動生成。
小結
在之前寫過的兩篇文章裡列舉了通過ADO.NET操作SQL Server資料庫與Dapper操作MySQL資料庫的方法。
.NET Core開發日誌——ADO.NET與SQL Server
.NET Core開發日誌——Dapper與MySQL
再加上這篇的通過Entity Framework操作PostgreSQL資料庫,.NET Core裡對於這類需求至少有三種解決方案。
而且每種方式都可以支援不同的資料庫。
Exchange/Dapper" rel="nofollow,noindex" target="_blank">Dapper has no DB specific implementation details, it works across all .NET ADO providers including SQLite, SQL CE, Firebird, Oracle, MySQL, PostgreSQL and SQL Server.
Entity Framework Database Providers這三種方式都可運用於生產環境,且已被無數正式專案驗證過,至於選用何種方式,主要取決於開發者的習慣與喜好。.NET Core生態圈還是相當自由的。