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源代码

posted @ 2020-08-12 19:59  cdboy  阅读(655)  评论(0编辑  收藏  举报