zoukankan      html  css  js  c++  java
  • EF Core DBFirst 和Code First小结

    使用默认模板建立asp.net core api应用

    CodeFirst代码

    public class User
        {
            public int ID { get; set; }
    
            public string Name { get; set; }
    
            public string Pwd { get; set; }
    
            public string Email { get; set; }
    
            public DateTime RegistTime { get; set; }
    
            public DateTime LastLoginTime { get; set; }
    
            public bool Status { get; set; }
        }
    
    public class MyDbContext : DbContext
        {
            public DbSet<User> Users { get; set; }
    
            public MyDbContext(DbContextOptions options) : base(options)
            {
            }
        }
    
    //startup文件变更 sqlserver
    public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers();
               //添加内容开始 services.AddDbContext<MyDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("ApiLoginCon")));
                //添加内容完成
            }
    //startup mysql
    public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers();
                services.AddDbContext<MyDbContext>(options =>
                options.UseMySQL(Configuration.GetConnectionString("ApiLoginCon")));
            }
    

    加入配置

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information"
        }
      },
      "AllowedHosts": "*",
      //注意检查server名称是否和当前机器一致
      "ConnectionStrings": {
        "ApiLoginCon": "Server=(localdb)\ProjectsV13;Database=EFGetStartedNewDb;Trusted_Connection=True;"
      }
      //Data Source=(localdb)ProjectsV13;Initial Catalog=master;Integrated Security=True;
      //Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False
      
      //mysql:Data Source=127.0.0.1;Database=TestDb;User ID=root;Password=123456;pooling=true;port=3306;sslmode=none;CharSet=utf8;
    }
    

    安装Nuget EF 支持库

    install-package Microsoft.EntityFrameworkCore 
    install-package Microsoft.EntityFrameworkCore.Design
    
    install-package Microsoft.EntityFrameworkCore.Tools
    
    //sql server
    install-package Microsoft.EntityFrameworkCore.SqlServer
    //mysql
    install-package MySql.Data
    install-package MySql.Data.EntityFrameworkCore
    install-package MySql.Data.EntityFrameworkCore.Design
    

    编译应用通过

    初始化数据库

    --初始化数据库

    Add-Migration init //生成迁移版本目录

    Update-Database init //初始化数据库

    --更新版本

    Add-Migration 1.0 //建立版本

    Update-Database 1.0 //执行版本更新

    命令 说明
    Add-Migration version 添加一个新的迁移(名词),version是迁移的名称
    remove-Migration 删除上一次的迁移
    Update-Database 更新最近一次的迁移到数据库(有时候可能与原来的数据库产生冲突,所以可能并不能迁移到数据库)
    Update-Database -Migration 0 表示清空数据库,回到空数据库状态
    Script-Migration [version] 查看迁移脚本,如果version就生成完整脚本

    导航属性和外键

    规范命名是指符合:

    命名为“[目标类型的键名],[目标类型名称]+[目标类型键名称]”,或“[导航属性名称]+[目标类型键名称]”的形式,在这里目标类型就是Destination,相对应的命名就是:DestinationId,DestinationDestinationId,TargetDestinationId

    如果不按约定,就自己指定:

    //方法一
    [ForeignKey("Target")]
    public int TarDestinationId { get; set; }
    public Destination Target { get; set; }
    
    //方法二
    public int TarDestinationId { get; set; }
    [ForeignKey("TarDestinationId")]
    public Destination Target { get; set; }
    
    //方法三
    modelBuilder.Entity<Lodging>().HasRequired(p => p.Target).WithMany(l => l.Lodgings).HasForeignKey(p => p.TarDestinationId);
    
    

    同一个实体多个引用的情况

    如果不加属性可能生成多个关联外键

    //第一联系人
    [InverseProperty("PrimaryContactFor")] 
    public Person PrimaryContact { get; set; }
    //第二联系人
    [InverseProperty("SecondaryContactFor")] 
    public Person SecondaryContact { get; set; } 
    

    多对多关系

    只要相互定义list导航属性就可以

    public class Activity
         {
             public int ActivityId { get; set; }
             [Required, MaxLength(50)] 
             public string Name { get; set; } 
             public List<Trip> Trips { get; set; }
         }
    
        public class Trip
        {
            public int TripId{get;set;}
            public DateTime StartDate{get;set;}
            public DateTime EndDate { get; set; }
            public decimal CostUSD { get; set; }
            public byte[] RowVersion { get; set; }
            public List<Activity> Activities { get; set; }
        }
    

    如果想指定中间表的名称和键,需要按如下设置

    modelBuilder.Entity<Trip>().HasMany(t => t.Activities).WithMany(a => a.Trips).Map(m =>
                    {
                        m.ToTable("TripActivities");
                        m.MapLeftKey("TripIdentifier");//对应Trip的主键
                        m.MapRightKey("ActivityId");
                    });
    
    或:
    
     modelBuilder.Entity<Activity>().HasMany(a => a.Trips).WithMany(t => t.Activities).Map(m =>
                    {
                        m.ToTable("TripActivities");
                        m.MapLeftKey("ActivityId");//对应Activity的主键
                        m.MapRightKey("TripIdentifier");
                    });
    
    
    

    一对一关联

    互相定义导航属性

    DBFirst

    在设计好数据结构后,执行如下命令:

    Scaffold-DbContext -Connection "Server=.;Database=DevManager;uid=sa;pwd=p@ssw0rd" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "." -force
    

    生成dbcontext源代码

  • 相关阅读:
    第三章:WebDriver 通过 XPath来 定位 table 表格
    第三章:对话框的 alertconfirmprompt 的处理
    第三章:iframe 的处理
    第三章:鼠标悬停 Actions
    第三章:文件上传
    弱网测试:Network-Emulator-Toolkit 工具中的一些词汇
    linux 下查看机器是cpu是几核的
    linux系统硬件配置
    Linux内核分析课程总结
    《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳
  • 原文地址:https://www.cnblogs.com/LifelongLearning/p/13492660.html
Copyright © 2011-2022 走看看