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