zoukankan      html  css  js  c++  java
  • .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
Copyright © 2011-2022 走看看