ASP.net Core EntityFramework Code EF code 汇总

Entity FrameWork EF 总结

EF Core

EF Core 如果实体模型很多,全部放在 上下文中的 OnModelCreating(ModelBuilder modelBuilder) 不太好维护

可以把实体模型 分离出去,每个类创建一个实体模型

csharp 复制代码
public class BookConfiguration :IEntityTypeConfiguration<Account>
{
	public void Configure(EntityTypeBuilder<Book> builder)
	{
	   //  把之前上下文中的  OnModelCreating(ModelBuilder modelBuilder) 
	   // 对应Account 的数据模型  复制到此处  即可
		builder.ToAble("Book")
	}
}

》》》原来的上下文中 替换成如下

csharp 复制代码
protected override void OnModelCreating(ModelBuilder modelBuilder) 
{
	modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
}

EF Core 环境搭建

csharp 复制代码
public class Book
{
    //必须是属性
    public long Id { get; set; }//主键
    public string Title { get; set; }//标题
    public DateTime PubTime { get; set; }//发布日期
    public double Price { get; set; }//单价
    public string AuthorName { get; set; }//作者名字
}
IEnityTypeConfiguration 配置类
csharp 复制代码
class BookEntityConfig : IEntityTypeConfiguration<Book>  //指定是对那个类进行配置
{
    public void Configure(EntityTypeBuilder<Book> builder) //实现接口
    {
    	//  Fluent API
        builder.ToTable("T_Books"); //实体对象在数据库中表的名字是"T_Books"
        //没有详细设置每个属性在数据库中的列明和数据类型
        //会默认吧属性名字作为列明,并根据属性类型来推断数据库中的数据类型
        
        //可以根据需要修改实体类的配置,进而修改数据库的表
        //HasMaxLength(50):最大长度为50 IsRequired():不可为空
        builder.Property(e => e.Title).HasMaxLength(50).IsRequired();
        builder.Property(e => e.AuthorName).HasMaxLength(20).IsRequired();
    }
}

上下文

csharp 复制代码
using Microsoft.EntityFrameworkCore;
class TestDbContext : DbContext
{
    public DbSet<Book> Books { get; set; } //可对上文的Book实体进行操作
    //配置数据库的连接
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSql("链接字符串或者取配置文件");
        optionsBuilder.LogTo(Console.WriteLine);
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //设置需要加载的程序集
        //加载当前程序集中所有实现了IEntityTypeConfiguration接口的类
        modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
    }
}
migration

到此,EF Core的环境搭建完成,总结一下,目前还没有数据库只是定义了实体对象, EF Core会根据我们定义的实体对象自动生成数据库,这种操作也被称之为迁移(migration)

目前只是实体对象创建完成,但是还没有在数据库中生成相应的表。

安装Nuget包Microsoft.EntityFrameworkCore.Tools。

在程序包管理器控制台中执行

Add-Migration 自定义名称,

这个一个迁移命令,建议名称是有意义的。

会自动在项目下生成Migrations文件夹,文件夹下生成相应的代码,其中名称为日期ID号_自定义名称的类,

其主要功能是创建数据库。

以上只是创建了生成数据库的类,但并没有执行。

在程序包管理器控制台中使用

Update-database

执行数据库迁移代码。

如果此时修改了BookEntityConfig中属性设置,需要再次执行一次{修改一次,就需要做一次迁移和Update-database}

Add-Migration 自定义名称,此时名称要和之前的不一样。

再次执行Update-database

预定大于配置

Data Annotation 数据注解

数据注解

使用.net提供的Attribute对实体类、属性进行标注,来实现实体类的配置。

csharp 复制代码
//[Keyless] // 表示一个没有主键的表    [key]  主键 不能同时使用
[Table("T_Books")] //将数据库表名设置为T_Books
[Comment("xxxxxx 表的 注释")]
[NotMapped] //排除表,即此表不映射到数据库(迁移、更新数据库)
public class Book
{
    [key]
    [DefaultValue(typeof(Int16),"200")]  //默认值
    public long Id { get; set; }//主键
	//将Title属性最大长度设置为50,且不能为空
    [MaxLength(50)] 
    [Required]
    [Column("xxx",TypeName="Varchar(20)")]
    public string Title { get; set; }//标题
    public DateTime PubTime { get; set; }//发布日期
    public double Price { get; set; }//单价
    [MaxLength(20)]
    [Required]
    public string AuthorName { get; set; }//作者名字
}

Fluent API

编写实现了IEntityTypeConfiguration接口的实体配置类

csharp 复制代码
class BookEntityConfig : IEntityTypeConfiguration<Book>  //指定是对那个类进行配置
{
    public void Configure(EntityTypeBuilder<Book> builder) //实现接口
    {
    	//  Fluent API
        builder.ToTable("T_Books"); //实体对象在数据库中表的名字是"T_Books"
        //没有详细设置每个属性在数据库中的列明和数据类型
        //会默认吧属性名字作为列明,并根据属性类型来推断数据库中的数据类型
        
        //可以根据需要修改实体类的配置,进而修改数据库的表
        //HasMaxLength(50):最大长度为50 IsRequired():不可为空
        builder.Property(e => e.Title).HasMaxLength(50).IsRequired();
        builder.Property(e => e.AuthorName).HasMaxLength(20).IsRequired();
    }
}

关系配置

资料

》》》文章Article和评论Article的关系就是一对多

csharp 复制代码
public class Article
{
	public long Id { get; set; }//主键
	public string Title { get; set; }//标题
	public string Content { get; set; }//内容
	public List<Comment> Comments { get; set; } = new List<Comment>(); //此文章的若干条评论
}

public class Comment
{
	public long Id { get; set; }
	public Article Article { get; set; } //对应的文章
	public string Message { get; set; }
}
csharp 复制代码
Article a1 = new Article();
a1.Title = "微软发布.NET 6大版本的首个预览";
a1.Content = "微软昨日在一篇官网博客文章中宣布了 .NET 6 首个预览版本的到来。";
Comment c1 = new Comment() { Message = "支持" };
Comment c2 = new Comment() { Message = "微软太牛了" };
Comment c3 = new Comment() { Message = "火钳刘明" };
a1.Comments.Add(c1);
a1.Comments.Add(c2);
a1.Comments.Add(c3);
using TestDbContext ctx = new TestDbContext();
ctx.Articles.Add(a1);//只需要加入Article就可以,会自动增加Comment对象到数据库
await ctx.SaveChangesAsync();
显示加载 Include 起到关联查询

Article a = ctx.Articles.Include(a => a.Comments).Single(a => a.Id == 1);

Include方法起到了关联查询作用,用它生成对其他关联实体的查询操作

使用Include不仅仅能够查询到id=1的文章,也能查询到该文章所对应的评论

csharp 复制代码
Article a = ctx.Articles.Include(a => a.Comments).Single(a => a.Id == 1);
Console.WriteLine(a.Title);
foreach (Comment c in a.Comments)
{
	Console.WriteLine(c.Id + ":" + c.Message);
}

EF Core高级技术

EF Core 原理
EF Core性能优化

EF core 创建数据库

csharp 复制代码
using ContosoUniversity.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddDbContext<SchoolContext>(options =>
  options.UseSqlServer(builder.Configuration.GetConnectionString("SchoolContext")));

builder.Services.AddDatabaseDeveloperPageExceptionFilter();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}
else
{
    app.UseDeveloperExceptionPage();
    app.UseMigrationsEndPoint();
}

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    var context = services.GetRequiredService<SchoolContext>();
    context.Database.EnsureCreated();
    // DbInitializer.Initialize(context);
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
相关推荐
奔跑的小十一3 小时前
JDBC接口开发指南
java·数据库
熊大如如3 小时前
PostgreSQL 创建只读账户
数据库·postgresql
尽兴-5 小时前
达梦数据库CASE WHEN条件
数据库·oracle·达梦
遗忘妳5 小时前
PostgreSQL初体验
数据库·postgresql
YuTaoShao6 小时前
Java八股文——Spring「Spring 篇」
java·数据库·spring
新知图书7 小时前
扣子数据库实战案例:搭建AI登记助手
数据库·智能体·扣子
麦兜*8 小时前
【Mysql及各种关系型数据库全面对比与深度解析(2025版)】
数据库·sql·mysql·postgresql·oracle·sqlserver·mariadb
扶光与望舒呀8 小时前
mysql 的卸载- Windows 版
数据库·mysql
星垣矩阵架构师8 小时前
架构设计之存储高性能——非关系型数据库(NoSQL)
数据库·架构·nosql
明月看潮生8 小时前
青少年编程与数学 01-011 系统软件简介 16 Redis数据库
数据库·redis·青少年编程·编程与数学