Entity Framework在.NET Core中被命名为Entity Framework Core。虽然通常会用于对SQL Server数据库进行数据操做,但其实它还支持其它数据库,这里就以PostgreSQL做为例子。html
PostgreSQL能够选用原生系统与Docker两种安装方式。git
在应用程序工程中添加相关的引用。
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
github
编写两个实体类,用于映射User表与Order表。sql
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类,并传入链接PostgreSQL所需的参数。docker
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"); } }
构建一个用于初始化数据库的辅助类。数据库
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(); } }
测试的程序第一步是调用生成数据的辅助类,第二步是查询数据表中的数据并在控制台中显示出来。app
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); }); } }
如下是显示的结果:
dom
程序正常运行的话,数据库中应该能够看到所生成的数据表:
ide
再查看数据表的生成脚本,能够看到字段以及表之间的关系皆经过Entity Framework自动生成。
post
在以前写过的两篇文章里列举了经过ADO.NET操做SQL Server数据库与Dapper操做MySQL数据库的方法。
.NET Core开发日志——ADO.NET与SQL Server
.NET Core开发日志——Dapper与MySQL
再加上这篇的经过Entity Framework操做PostgreSQL数据库,.NET Core里对于这类需求至少有三种解决方案。
并且每种方式均可以支持不一样的数据库。
ADO.NET data provider
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生态圈仍是至关自由的。