翼度科技»论坛 编程开发 .net 查看内容

Net6 EFcore框架介绍

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
1、简介
  EFcore,可用使得开发人员不需要再去关注数据库的实现,全都由代码进行生成
  这样有利于减少工作量、数据库快速迁移...
2、上手搭建架构
  

  (这个图是做完本章内容的完整图,我们一步步深入即可)
  在写EF之前,先安装好数据库,我选择在本地安装Sqlserver
 
  我们先执行最核心的两步,将EF和数据库跑通
  1)类&表的定义:基本上会保持class和数据库的table字段保持一致,如上UserModel,我定义了Staff、Tenant两个类,会自动生成两个表
    UserModel需要安装
  1. Microsoft.EntityFrameworkCore.SqlServer
复制代码
    Staff
  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. namespace UserModel
  4. {
  5.     public class Staff
  6.     {
  7.         public int Id { get; set; }public string Name { get; set; }
  8.         public string Description { get; set; }
  9.         public string? PhoneNumber { get; set; }
  10.         public string? Email { get; set; }
  11.     }
  12. }
复制代码
    Tenant
  1. namespace UserModel
  2. {
  3.     public class Tenant
  4.     {
  5.         public int Id { get; set; }
  6.         public string Name { get; set; }
  7.         public string Description { get; set; }
  8.     }
  9. }
复制代码
  2)上下文定义:负责关联实体类、访问数据库配置,提供后续生成数据库支持,如上MyDBContextLibrary
  MyDBContextLibrary需要安装
  1. Microsoft.EntityFrameworkCore.Tools
复制代码
  MyDBContext
  1. using Microsoft.EntityFrameworkCore;
  2. namespace UserModel
  3. {
  4.     public class MyDBContext : DbContext
  5.     {
  6.         public DbSet<Staff> Staffs { get; set; }
  7.         public DbSet<Tenant> Tenants { get; set; }
  8.         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  9.         {
  10.             base.OnConfiguring(optionsBuilder);
  11.             optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=master;Integrated Security=True;TrustServerCertificate=yes");
  12.         }
  13.     }
  14. }
复制代码
  准备完毕!!
  打开【程序包管理器控制台】
  项目指定到MyDBContext
  
  1. Add-Migration Ini   #添加一个迁移  Ini是为这个迁移起的备注名
  2. Update-database  #更新到数据库,执行了才会同步迁移到数据库
复制代码
  到此,简单的EF框架已经跑起来了
3、扩展
  EF是一个十分强大的框架,我们逐渐扩展知识点。
  1)属性定义
  有两种方式
  其一:Data Annotations(数据注解),利用特性进行定义,如对Staff属性进行定义
  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. //Data Annotations例子
  4. namespace UserModel
  5. {
  6.     [Table("Staff")]//可用加特性指定表名
  7.     public class Staff
  8.     {
  9.         public int Id { get; set; }
  10.         [Required]//必填
  11.         [MaxLength(10)]//最大长度为10
  12.         public string Name { get; set; }
  13.         [Required]
  14.         public string Description { get; set; }
  15.         public string? PhoneNumber { get; set; } //可空
  16.         public string? Email { get; set; }
  17.     }
  18. }
复制代码
  PS:提醒一点,Id / 类名+Id  在迁移到数据库表的时候,会默认为递增序列
  其二:Fluent API,微软官方提供的API,如对Tenant属性进行定义
  在MyDBContext,重写OnModelCreating方法
  1. using Microsoft.EntityFrameworkCore;
  2. namespace UserModel
  3. {
  4.     public class MyDBContext : DbContext
  5.     {
  6.         public DbSet<Staff> Staffs { get; set; }
  7.         public DbSet<Tenant> Tenants { get; set; }
  8.         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  9.         {
  10.             base.OnConfiguring(optionsBuilder);
  11.             optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=master;Integrated Security=True;TrustServerCertificate=yes");
  12.         }
  13.         protected override void OnModelCreating(ModelBuilder modelBuilder)
  14.         {
  15.             base.OnModelCreating(modelBuilder);modelBuilder.Entity<Tenant>().Property(x=>x.Description).IsRequired(false); /*指定Description非必填*/
  16.         }
  17.     }
  18. }
复制代码
  当然,我们容易看到,如果实体很多,属性直接写在这里代码太冗长了
  改变一下方法,添加一个TenantConfig类
  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.EntityFrameworkCore.Metadata.Builders;
  3. namespace UserModel
  4. {
  5.     public class TenantConfig : IEntityTypeConfiguration<Tenant>
  6.     {
  7.         public void Configure(EntityTypeBuilder<Tenant> builder)
  8.         {
  9.             builder.ToTable("Tenant");//可重新指定表名
  10.             builder.HasKey(x => x.Id);
  11.             builder.Property(x=>x.Name).IsRequired().HasColumnType("nvarchar(100)");
  12.             builder.Property(x=>x.Description).IsRequired(false);
  13.         }
  14.     }
  15. }
复制代码
  然后  DbContext:
  1. using Microsoft.EntityFrameworkCore;
  2. namespace UserModel
  3. {
  4.     public class MyDBContext : DbContext
  5.     {
  6.         public DbSet<Staff> Staffs { get; set; }
  7.         public DbSet<Tenant> Tenants { get; set; }
  8.         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  9.         {
  10.             base.OnConfiguring(optionsBuilder);
  11.             optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=master;Integrated Security=True;TrustServerCertificate=yes");
  12.         }
  13.         protected override void OnModelCreating(ModelBuilder modelBuilder)
  14.         {
  15.             base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(typeof(Tenant).Assembly); //利用反射,加载Tenant程序集下的IEntityTypeConfiguration
  16.         }
  17.     }
  18. }
复制代码
  完成,再次生成一个迁移到数据库看看!!!
  代码不会一步到位的,大家逐步测试严重,这边我就不贴数据库的截图了
4、最后说明一下ConsoleApp
  Program
  1. using UserModel;
  2. using(var ctx = new MyDBContext())
  3. {
  4.     var s = new Staff()
  5.     {
  6.         Name = "kxy2",
  7.         Description = "三好员工",
  8.         PhoneNumber = "1234567890"
  9.     };
  10.     ctx.Staffs.Add(s);
  11.     var t = new Tenant()
  12.     {
  13.         Name = "ccc",
  14.     };
  15.     ctx.Tenants.Add(t);
  16.     ctx.SaveChanges();
  17. }
  18. Console.ReadLine();
复制代码
  测试数据而已,怎么方便怎么来
  PS:有个点,如果设置ConsoleApp为启动项,迁移的时候会验证启动项的依赖,从而产生错误
  ConsoleApp需要安装
  1. Microsoft.EntityFrameworkCore.Design
复制代码
  至此,完成!!
  感谢关注
  
 

来源:https://www.cnblogs.com/wskxy/archive/2023/03/04/17179491.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具