.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模式是代码优先,通过记录需要映射的实体类的变动,来对数据库表结构进行修改。

  

原文地址:https://www.cnblogs.com/shadoll/p/14513197.html