4.1EF Core
EF Core是微軟官方的ORM框架,ORM即對(duì)象關(guān)系映射,也就是我們可以直接操作C#中的對(duì)象就可以完成數(shù)據(jù)庫的操作。
EF Core環(huán)境搭建
- 首先要?jiǎng)?chuàng)建C#對(duì)象,用以對(duì)應(yīng)數(shù)據(jù)庫中的表,該C#對(duì)象也成為實(shí)體類。
public class Book
{
//必須是屬性
public long Id { get; set; }//主鍵
public string Title { get; set; }//標(biāo)題
public DateTime PubTime { get; set; }//發(fā)布日期
public double Price { get; set; }//單價(jià)
public string AuthorName { get; set; }//作者名字
}
-
根據(jù)所用的數(shù)據(jù)庫選擇NuGet包,本文使用SQLite數(shù)據(jù)庫,所以安裝Microsoft.EntityFrameworkCore.Sqlite。
-
需要實(shí)現(xiàn)一個(gè)配置類,用來說明實(shí)體類和數(shù)據(jù)庫表是怎么映射的,該配置類要實(shí)現(xiàn)
IEnityTypeConfiguration
接口。
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
class BookEntityConfig : IEntityTypeConfiguration<Book> //指定是對(duì)那個(gè)類進(jìn)行配置
{
public void Configure(EntityTypeBuilder<Book> builder) //實(shí)現(xiàn)接口
{
builder.ToTable("T_Books"); //實(shí)體對(duì)象在數(shù)據(jù)庫中表的名字是“T_Books”
//沒有詳細(xì)設(shè)置每個(gè)屬性在數(shù)據(jù)庫中的列明和數(shù)據(jù)類型
//會(huì)默認(rèn)吧屬性名字作為列明,并根據(jù)屬性類型來推斷數(shù)據(jù)庫中的數(shù)據(jù)類型
//可以根據(jù)需要修改實(shí)體類的配置,進(jìn)而修改數(shù)據(jù)庫的表
//HasMaxLength(50):最大長(zhǎng)度為50 IsRequired():不可為空
builder.Property(e => e.Title).HasMaxLength(50).IsRequired();
builder.Property(e => e.AuthorName).HasMaxLength(20).IsRequired();
}
}
- 創(chuàng)建數(shù)據(jù)訪問類,即上下文類。必須實(shí)現(xiàn)
DbContext
接口。
using Microsoft.EntityFrameworkCore;
class TestDbContext : DbContext
{
public DbSet<Book> Books { get; set; } //可對(duì)上文的Book實(shí)體進(jìn)行操作
//配置數(shù)據(jù)庫的連接
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=MySqLite.db");
optionsBuilder.LogTo(Console.WriteLine);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//設(shè)置需要加載的程序集
//加載當(dāng)前程序集中所有實(shí)現(xiàn)了IEntityTypeConfiguration接口的類
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
到此,EF Core的環(huán)境搭建完成,總結(jié)一下,目前還沒有數(shù)據(jù)庫只是定義了實(shí)體對(duì)象, EF Core會(huì)根據(jù)我們定義的實(shí)體對(duì)象自動(dòng)生成數(shù)據(jù)庫,這種操作也被稱之為遷移(migration)。
- 目前只是實(shí)體對(duì)象創(chuàng)建完成,但是還沒有在數(shù)據(jù)庫中生成相應(yīng)的表。安裝Nuget包Microsoft.EntityFrameworkCore.Tools。
- 在程序包管理器控制臺(tái)中執(zhí)行Add-Migration
自定義名稱
,這個(gè)一個(gè)遷移命令,建議名稱是有意義的。
會(huì)自動(dòng)在項(xiàng)目下生成Migrations文件夾,文件夾下生成相應(yīng)的代碼,其中名稱為日期ID號(hào)
_自定義名稱
的類,其主要功能是創(chuàng)建數(shù)據(jù)庫。
- 以上只是創(chuàng)建了生成數(shù)據(jù)庫的類,但并沒有執(zhí)行。在程序包管理器控制臺(tái)中使用
Update-database
執(zhí)行數(shù)據(jù)庫遷移代碼。
續(xù):
- 如果此時(shí)修改了BookEntityConfig中屬性設(shè)置,需要再次執(zhí)行一次Add-Migration
自定義名稱
,此時(shí)名稱要和之前的不一樣。 - 再次執(zhí)行
Update-database
數(shù)據(jù)的增刪改查
插入數(shù)據(jù)
//要使用using,使用完成后釋放
using TestDbContext ctx = new TestDbContext();
//也是C#新語法,在創(chuàng)建的時(shí)候直接定義屬性
var b1 = new Book
{
AuthorName = "楊中科",
Title = "零基礎(chǔ)趣學(xué)C語言",
Price = 59.8,
PubTime = new DateTime(2019, 3, 1)
};
var b2 = new Book
{
AuthorName = "Robert Sedgewick",
Title = "算法(第4版)",
Price = 99,
PubTime = new DateTime(2012, 10, 1)
};
ctx.Books.Add(b1);
ctx.Books.Add(b2);
//以上部分只是修改了內(nèi)容中的數(shù)據(jù),需要使用save方法保存在數(shù)據(jù)庫中,推薦使用異步方法
await ctx.SaveChangesAsync();
查詢數(shù)據(jù)
可以使用LinQ對(duì)DbSet進(jìn)行數(shù)據(jù)查詢。文章來源:http://www.zghlxwxcb.cn/news/detail-449211.html
using TestDbContext ctx = new TestDbContext();
var books = ctx.Books.Where(b => b.Price > 80);
var booksOrder = ctx.Books.OrderBy(b => b.Price);//按照價(jià)格排序
var booksGroup = ctx.Books.GroupBy(b => b.AuthorName).Select(g => new { AuthorName = g.Key, booksCount = g.Count(), MaxPrice = g.Max(b => b.Price) });//分組后處理,利用了匿名類
修改和刪除數(shù)據(jù)
using TestDbContext ctx = new TestDbContext();
var b = ctx.Books.Single(b => b.Title == "數(shù)學(xué)之美");
b.AuthorName = "Jun Wu";
await ctx.SaveChangesAsync();
//刪除
var b = ctx.Books.Single(b => b.Title == "數(shù)學(xué)之美");
ctx.Remove(b);//也可以寫成ctx.Books.Remove(b);
await ctx.SaveChangesAsync();
**注意:**無論是修改還是刪除,都要先執(zhí)行數(shù)據(jù)的查詢,最后需要保存。文章來源地址http://www.zghlxwxcb.cn/news/detail-449211.html
到了這里,關(guān)于4.1EF Core的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!