.NET Entity
Framework Code First Database Migration
▌背景
今天遇到的課題是在DB-First的資料庫中, 如果新程式是採用Code-First且必須和現有的資料表產生關連 (Foreign Key), 是否也可以正常的以Migration的指令更新資料庫? 答案是可以的, 不過有一些小眉角要稍微調整一下。
|
▌環境
l
Visual Studio 2015 Ent.
l
Entity Framework 6.1.3
|
▌Update database with Migration command
原始已完成的Code-First專案如下。
▋加入需要產生關聯之現有表格的POCO
已存在資料庫的表格,當然就不要浪費時間再實作它的POCO,直接以實體資料模型建立它。
預設也會產生一個繼承DbContext的類別,若先前已經實作DbContext,可直接刪除它。
此範例是加入一個現有的資料表: Employees
為了維持代碼的一致性,我手動更新類別名稱;
|
▋Add the relations between POCOs
接下來就視需要加上Relation的代碼:
l
Employee
[Table("Employees")]
public partial class Employee
{
[Key]
[Column(Order = 0)]
[StringLength(50)]
public string Id { get; set; }
[Column(Order = 1)]
[StringLength(50)]
public string Name { get; set; }
/// <summary>
/// 一對多關係
/// </summary>
public virtual ICollection<Book> Books { get; set; }
}
|
l
Book
[Table("Books")]
public class Book
{
[Key]
[Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Int32 BookId { get; set; }
[Column(Order = 2, TypeName = "NVARCHAR")]
[MaxLength(50)]
public String Title { get; set; }
[Column(Order = 3,
TypeName = "NVARCHAR")]
[MaxLength(50)]
public String EmployeeId { get; set; }
//Foreign Key
[ForeignKey("EmployeeId")]
public virtual Employee Employee { get; set; }
}
|
l
DbContext
public class MyDbContext :
System.Data.Entity.DbContext
{
public MyDbContext()
: base("name=MyDbContext") //指定對應的Connection String名稱
{
}
public DbSet<Book> Books { get; set; }
public DbSet<Employee> Employees { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
try
{
///Employee 一對多 Book
modelBuilder.Entity<Employee>().HasMany(m => m.Books).WithRequired(m =>
m.Employee);
}
catch (Exception ex) { }
}
}
|
▋Migration
接下來開始執行更動資料庫的動作,先 Enable-Migrations 後,建立初始的Migration:
執行Update-Database指令後,會出現以下錯誤訊息並終止更新資料庫:
資料庫中已經有一個名為
'Employees' 的物件。
|
▋Migration : Trouble shooting
解決方式:
開啟\Migrations\[日期時間]_InitialCreate.cs
將和Employees相關的程式碼移除;
重新執行Update-Database指令,成功更新資料庫。
查看一下資料庫,已經Create表格Books,並且有加上Foreign Key了。
沒有留言:
張貼留言