1

我收到由不同的方法有點困惑遷移實體框架6.1.1代碼優先遷移的規則/要求是什麼?爲了使它們發生,我需要做些什麼?

截至目前爲止,這是我的理解是,我不得不總是以更新模式運行Update-Database,以便它反映了我新增模型。但現在我只是設法創建了一個POCO模型,在我的ApplicationDbContext中添加了一個DbSet<Foo> Foos {get;set;},重新構建了應用程序,並且所有東西都可以神奇地工作。

此前我記得必須運行Enable-Migrations,然後打開自動遷移並始終調用Update-Database進行遷移,但看起來這畢竟沒有必要?

只是爲了澄清,我使用ASP.NET Web應用程序模板與MVC和Internet身份驗證(只是由腳手架生成的基本用戶帳戶)。

似乎有很多不同的遷移方法和很多教程,其中每個教程都有一點不同,我不確定哪種方法實際上是正確的。我覺得我將可以分開的東西混合在一起。我在網上找到的大部分資源還引用了不同版本的EF和ASP.NET MVC。

需要什麼步驟才能根據我的POCO模型生成我的數據庫模式?是否有一種簡單的方法可以根據需要自動重新創建和重新生成數據庫,或者我必須在此之後繼續使用Update-Database

我正在使用Visual Studio 2013 Ultimate如果這是任何相關性。

回答

1

我相信你在這裏有很多問題,所以我會盡我所能解決它們。

第一:

我只是設法創建一個POCO模型,添加DbSet FOOS {獲得;設置;}我ApplicationDbContext,重新構建應用程序和 一切神奇地運行。

看起來好像你有Automatic Code First Migrations爲你的項目打開。從提供的鏈接,似乎自動遷移不被默認啓用,所以東西必須在您的最終通過運行該命令已經改變,或者通過使用自定義代碼(後來證明)

From MSDN

如果您要再次運行應用程序,您將得到一個 InvalidOperationException,聲明自創建數據庫以來,支持「BlogContext」 上下文的模型已更改。考慮使用 Code First Migrations來更新數據庫( http://go.microsoft.com/fwlink/?LinkId=238269)。

正如例外情況所示,現在是時候開始使用Code First 遷移。因爲我們想要使用自動遷移,所以我們要 指定-EnableAutomaticMigrations開關。

運行在 包管理器控制檯啓用的遷移-EnableAutomaticMigrations命令

下一頁:

的步驟需要什麼,以便能夠根據我的POCO模型來生成我的數據庫架構 ?

那麼,你有幾個選擇在這裏; EF自動遷移,EF'標準'遷移,第三方庫遷移(FluentMigrator)。這本身就是一個廣泛的問題。但是任何和所有選項都是有效的,這隻取決於你的需求。我目前正在使用EF自動遷移功能進行個人項目和FluentMigrator的工作。

最後:

有一個簡單的辦法只有重新創建和重新播種的數據庫,自動根據需要 ,還是我使用更新的數據庫的 ,經過不斷?

你想在這裏做什麼是一個重要的問題。我很肯定你不想在生產中刪除和重新創建/重新設置數據庫(儘管這是可能的)。

您可能會想要使用某種DBInitializer以適應您的需求。這是幾個月前我研究這個時使用的tutorial。你有3個默認選項(CreateDatabaseIfNotExistsDropCreateDatabaseIfModelChangesDropCreateDatabaseAlways),當然定製自己的能力。

可用的另一個選項是編寫自定義DbMigrationsConfiguration。我找不到那篇文章,但是這裏有一些示例代碼。在這段代碼中,我有我的DBContext初始化使用我的自定義配置類,其中我已打開EF自動遷移並填充我的數據庫的一些默認數據。

的DbContext

public ApplicationDBContext() 
    : base("DefaultConnection") 
{ 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDBContext, IBCF.Core.Migrations.Configuration>()); 
} 

配置

internal sealed class Configuration : DbMigrationsConfiguration<IBCF.Core.ApplicationDBContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 

protected override void Seed(IBCF.Core.ApplicationDBContext context) 
{ 
    //Initialize managers 
    var userManager = new UserManager<User>(new UserStore<User>(context)); 
    var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 

    if(userManager.FindByEmail("[email protected]") == null) 
    { 
     //Add default system roles 
     roleManager.Create(new IdentityRole("Superuser")); 
     roleManager.Create(new IdentityRole("User")); 

     //Add default system users 
     var superuser1 = new User() { FirstName = "John", LastName = "Doe", Email = "[email protected]", UserName = "[email protected]" }; 
     if (userManager.Create(superuser1, "[email protected]").Succeeded) 
     { 
      userManager.AddToRole(superuser1.Id, "Superuser"); 
     } 
    } 

    context.SaveChanges(); 
} 
} 
1
  • 截至目前爲止,這是我的理解是,我不得不總是以更新模式運行更新,數據庫以便它反映我新添加的模型。

    您可以從包管理器控制檯,初始化程序或代碼運行遷移。

    • 從PMC PM> Update-Database
    • 從初始Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppContext, Configuration>());DbMigrator(new Configuration()).Update()
    • 從代碼new DbMigrator(new Configuration()).Update();
  • 但現在我只是設法創建一個POCO模型,添加DbSet FOOS {獲取;集;}到我的ApplicationDbContext,重新構建應用程序,一切都神奇地工作。

    如果您已退出數據庫,並且模型中有新的更改(例如,通過添加新的DbSet<T>或者只是添加一個新的屬性,而不設置任何初始化程序/遷移(在代碼或配置中),您應該會得到類似的錯誤。

    自創建數據庫 以來,支持'AppContext'上下文的模型已更改。考慮使用Code First Migrations來更新數據庫 。

    您可能已設置某處使用MigrateDatabaseToLatestVersion並設置爲AutomaticMigrationsEnabled = true;

  • 然後打開自動遷移並始終調用Update-Database進行遷移,但看起來這畢竟沒有必要?

    是的,一旦啓用了自動遷移,就沒有必要了。

  • 需要什麼步驟才能根據我的POCO模型生成我的數據庫模式?

    如果你想手動維護數據庫版本:

    • 創建一個從DbMigrationsConfiguration<TContext>衍生或只使用PMC PM> Enable-Migrations
    • 創建DbMigration手動編寫的SQL查詢每個版本或者只是配置類使用PMC PM> Add-Migration MigrationNameForVersioning
    • 禁用自動遷移AutomaticMigrationsEnabled = false
    • 將初始值設置爲MigrateDatabaseToLatestVersion

    如果您只是想自動更新數據庫而不手動創建每個遷移版本。

    • 創建一個從DbMigrationsConfiguration<TContext>派生配置類或只是使用PMC PM> Enable-Migrations
    • 啓用自動遷移AutomaticMigrationsEnabled = true
    • 設置初始化到MigrateDatabaseToLatestVersion

代碼

internal sealed class Configuration : DbMigrationsConfiguration<AppContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     ContextKey = "AppContext"; // don't forget to match this key if create the class manually 
    } 

    protected override void Seed(AppContext context) 
    { 
    } 
} 

使用

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<AppContext, Configuration>()); 

更多

相關問題