2015年10月22日 星期四

[Entity Framework 6] Code Frist (4) - Migration commands in DB-First database

.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了。 




沒有留言:

張貼留言