.Net EntityFramework(EF) CodeFirst模式
一.前言
EntityFramework(EF)是微软推出的一个根据ORM(对象关系映射)思想搭建的框架,它的作用是将我们操作对象的行为转化为操作数据库的行为,举个例子就是创建对象变成sql的insert,修改对象变成sql的update,移除对象变成sql的delete。EF会将这些对象操作转变成sql语句,在底层里仍然是使用ADO.Net去执行sql。
EF有三种模式,CodeFirst、ModelFirst和DataBaseFirst。
CodeFirst,代码优先,根据对象来生成数据库的表;
ModelFirst,模型优先,创建Edm模型,再根据它生成对象和数据库。
DataBaseFirst,数据库优先,根据数据库去创建Edm模型和对象。
建议使用CodeFirst,现在主流都是这个模式。另外两个模式看情况使用,用的人不多。
二.使用
1.安装包
Nuget上下载EFCore相关依赖。
2.相关类
创建User类,上下文MyDbContext。
[Table("T_User")] public class User { [Key] public Guid ID { get; set; } public string Name { get; set; } } public class MyDbContext : DbContext { public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //定义表格式 //1.在类上直接用attribute配置 //2.builder找到要映射的实体,再进行配置 //modelBuilder.Entity<User>().ToTable("T_User").HasKey(x => x.ID); //3.将2步骤的配置写在配置文件中,然后去读取 //modelBuilder.ApplyConfiguration(new UserEntityCfg()); } //获取上下文映射的实体类,类似容器 public virtual DbSet<User> Users { get; set; } } public class UserEntityCfg : IEntityTypeConfiguration<User> { public void Configure(EntityTypeBuilder<User> builder) { builder.ToTable("T_User") .HasKey(x => x.ID); } }
在Startup.cs中把EF上下文注入到容器中。
public void ConfigureServices(IServiceCollection services) { services.AddDbContextPool<MyDbContext>( options => options.UseSqlServer("Server=.;Database=Demo;Uid=sa;Password=xxx")); }
3.使用命令
在vs上,点上栏“工具”->“Nuget包管理器”->“程序包管理器控制台”。
输入命令,Add-Migration xxx(xxx自己填) 添加迁移文件,即记录这一次所有关联映射的实体与上一次迁移发生的变动,生成的文件会出现在Migrations文件下。有时间的文件是这一次的迁移,最下面的文件是快照。
输入命令,Update-Database,根据迁移文件去创建数据库的表。
4.程序调用
namespace app.Controllers { [Route("api/test")] [ApiController] public class TestController : ControllerBase { private readonly MyDbContext _context; public TestController(MyDbContext context) { _context = context; } [Route("add")] [HttpPost] public string Add(string value) { string result = ""; User user = new User() { ID = Guid.NewGuid(), Name = value }; _context.Set<User>().Add(user); int count = _context.SaveChanges(); if (count > 0) { result = "添加成功"; } else { result = "添加失败"; } return result; } [Route("get")] [HttpPost] public User Get(Guid id) { User user = _context.Users.Where(x => x.ID == id).FirstOrDefault(); return user; } } }
可以发现,我们没有写sql语句也一样可以对数据库进行操作。
三.总结
1.EF是个ORM框架,让我们不用写sql便可以对数据库进行操作。
2.CodeFirst模式是代码优先,通过记录需要映射的实体类的变动,来对数据库表结构进行修改。