EF Core DBFirst 和Code First小結
阿新 • • 發佈:2020-08-12
使用預設模板建立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原始碼