1. 程式人生 > >.NET Core開發日誌——Entity Framework與PostgreSQL

.NET Core開發日誌——Entity Framework與PostgreSQL

list() reat 實體類 運行 cnblogs 通過 des user works

Entity Framework在.NET Core中被命名為Entity Framework Core。雖然一般會用於對SQL Server數據庫進行數據操作,但其實它還支持其它數據庫,這裏就以PostgreSQL作為例子。

PostgreSQL

PostgreSQL可以選用原生系統與Docker兩種安裝方式。

  • Official
  • 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裏對於這類需求至少有三種解決方案。
而且每種方式都可以支持不同的數據庫。

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生態圈還是相當自由的。

.NET Core開發日誌——Entity Framework與PostgreSQL