zoukankan      html  css  js  c++  java
  • EntityFrameworkCore CodeFirst 使用

    下面是项目结果
    EFDemo是API应用
    EFDemo.Data是standard库,用来迁移写查询语句
    EFDemo.Entity是standard库,用来写实体

    EFDemo引用EFDemo.Data
    EFDemo.Data引用EFDemo.Entity
    EFDemo设为启动项安装nuget包 Install-Package Microsoft.EntityFrameworkCore.Tools
    EFDemo.Data安装nuget包 Install-Package Microsoft.EntityFrameworkCore.SqlServer
    编写EFDemo.Entity这里可以使用特性或导航属性来写表之间的关系,但是不推荐,不直观,我这里用API的方式去写表之间的关系

    Order类 因为需要User和Product的外键把这个两个属性也写上,后面写关系会用到

    public class Order
    {
      public int OrderId { get; set; }
      public int ProductId { get; set; }
      public Product Product { get; set; }
      public int UserId { get; set; }
      public User User { get; set; }
    }
    

    Product 类 Order属性写上,后面写关系会用到,这代表order 和 Product 1对1的关系

    public class Product
    {
      public int ProductId { get; set; }
      public string ProductName { get; set; }
      public int ProductNum { get; set; }
      public Order Order { get; set; }
    }
    

    User类 Orders 属性,这代表order 和 User 1对多的关系

    public class User
    {
      public User()
      {
        Orders = new List<Order>();
      }
      public int UserId { get; set; }
      public string UserName { get; set; }
      public List<Order> Orders { get; set; }
    }
    

    编写EFDemo.Data 这里写上下文和数据种子,新建MyDbContext类继承DbContext
    DbSet是上下文的自动属性,DbContext 会自动为每个属性调用 setter,以设置相应 DbSet 的实例
    OnConfiguring重写方法用来写一些数据库配这列如连接字符串,连接字符串我这里没写,在EFDemo里重写了
    OnModelCreating重写方法写一些表关系和种子数据,还可以写一些表的操作

    public class MyDbContext : DbContext
    {
      public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
      {
      }
      public DbSet<User> Users { get; set; }
      public DbSet<Order> Orders { get; set; }
      public DbSet<Product> Products { get; set; }
      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
        base.OnConfiguring(optionsBuilder);
      }
      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
        modelBuilder.Entity<User>().HasKey(t => t.UserId);
        modelBuilder.Entity<Product>().HasKey(t => t.ProductId);
        modelBuilder.Entity<Order>(t =>
                    {
                      t.HasKey(x => x.OrderId);
                      t.HasOne(x => x.Product).WithOne(x => x.Order).HasForeignKey<Order>(x => x.ProductId);
                      t.HasOne(x => x.User).WithMany(x => x.Orders).HasForeignKey(x => x.UserId);
                    });
        modelBuilder.Entity<User>().HasData(new User[] 
                    {
                      new User{ UserId = 1, UserName = "张三" },
                      new User{ UserId = 2, UserName = "李四" },
                      new User{ UserId = 3, UserName = "麻五" }
                    });
        modelBuilder.Entity<Product>().HasData(new Product[]
                    {
                      new Product{ ProductId = 1, ProductName = "烤鸭", ProductNum = 30 },
                      new Product{ ProductId = 2, ProductName = "火腿", ProductNum = 40 },
                      new Product{ ProductId = 3, ProductName = "啤酒", ProductNum = 50 }
                    });
        modelBuilder.Entity<Order>().HasData(new Order[] 
                    {
                      new Order{ OrderId = 1, ProductId = 1, UserId = 2 },
                      new Order{ OrderId = 2, ProductId = 2, UserId = 2 },
                      new Order{ OrderId = 3, ProductId = 3, UserId = 2 }
                    });
      }
    }
    

    EFDemo的Startup类注入ef的上下文重写OnConfiguring 配置链接字符串
    如下json配置文件

    Startup注册上下文重写OnConfiguring

      services.AddDbContext<MyDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("LocaldbContext")));
    

    打开包管理工具的控制台进行数据迁移
    选中带有上下文的类库

    get-help EntityFrameworkCore 可以看到有哪些迁移命令

    常用命令
    Add-Migration 生成迁移文件
    Remove-Migration 生成迁移文件出错,可以用这个来回滚
    Update-Database 更新到数据库
    MyDbContextModelSnapshot是生成的迁移文件,20200418120418_1,20200418120418_2是迁移版本

  • 相关阅读:
    《linux内核设计与实现》读书笔记第十八章
    20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
    2013337朱荟潼 Linux第四章读书笔记——进程调度
    2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接
    20135337朱荟潼 Linux第七周学习总结——可执行程序的装载
    2013337朱荟潼 Linux第三章读书笔记——进程管理
    20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建
    2013337朱荟潼 Linux第十八章读书笔记——调试
    20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)
    2013337朱荟潼 Linux第五章读书笔记——系统调用
  • 原文地址:https://www.cnblogs.com/SuperDust/p/12730267.html
Copyright © 2011-2022 走看看