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

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

PostgreSQL

PostgreSQL能夠選用原生系統與Docker兩種安裝方式。git

Package

在應用程序工程中添加相關的引用。
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQLgithub

Entity

編寫兩個實體類,用於映射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

構建必要的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");
    }
}

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

測試的程序第一步是調用生成數據的輔助類,第二步是查詢數據表中的數據並在控制檯中顯示出來。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生態圈仍是至關自由的。

相關文章
相關標籤/搜索