[英]What are the rules/requirements for code-first migrations and what do I need to do to make them happen?
我對實體框架6.1.1中的不同遷移方法感到困惑
到目前為止,據我了解,我必須始終運行Update-Database
才能更新架構,以便其反映我新添加的模型。 但是現在,我剛剛設法創建了POCO模型,將DbSet<Foo> Foos {get;set;}
到我的ApplicationDbContext
,重新構建了應用程序,並且一切都神奇地起作用了。
以前,我記得必須運行Enable-Migrations
,然后打開自動遷移,並始終調用Update-Database
進行遷移,但這似乎根本沒有必要嗎?
為了澄清起見,我將ASP.NET Web應用程序模板與MVC和Internet身份驗證結合使用(只是由腳手架生成的基本用戶帳戶)。
遷移似乎有很多不同的方法,而且教程如此之多,其中每個教程的執行方式都有些不同,因此我不確定哪種方法實際上是正確的。 在我看來,我正在將可以分開的東西混合在一起。 我在網上找到的大多數資源都引用了EF和ASP.NET MVC的不同版本。
能夠根據我的POCO模型生成數據庫架構的步驟是什么? 是否有一種簡單的方法可以自動根據需要自動重新創建和重新設置數據庫,或者在此之后是否必須繼續使用Update-Database
?
如果有任何相關性,我正在使用Visual Studio 2013 Ultimate。
我相信您在這里有多個問題,所以我會盡力解決。
第一:
我只是設法創建了一個POCO模型,將DbSet Foos {get; set;}添加到我的ApplicationDbContext中,重新構建了該應用程序,並且一切都神奇地起作用了。
好像您為項目打開了“ 自動代碼優先遷移” 。 從提供的鏈接來看,默認情況下似乎未啟用自動遷移,因此必須通過運行命令或使用自定義代碼對您的端進行更改(如下所示)
如果要再次運行該應用程序,則會收到一個InvalidOperationException聲明,說明自創建數據庫以來,支持“ BlogContext”上下文的模型已更改。 考慮使用Code First Migrations更新數據庫( http://go.microsoft.com/fwlink/?LinkId=238269 )。
如異常所示,是時候開始使用代碼優先遷移了。 因為我們要使用自動遷移,所以我們將指定–EnableAutomaticMigrations開關。
在程序包管理器控制台中運行Enable-Migrations –EnableAutomaticMigrations命令
下一個:
能夠根據我的POCO模型生成數據庫架構的步驟是什么?
好吧,您在這里有幾種選擇。 EF自動遷移,EF“標准”遷移,第三方庫遷移( FluentMigrator )。 這本身就是一個廣泛的問題。 但是所有選項都是有效的,這取決於您的需求。 我目前正在將EF自動遷移用於個人項目,並且正在使用FluentMigrator。
最后:
是否有一種簡單的方法可以自動根據需要自動重新創建和重新設置數據庫,或者在此之后是否必須繼續使用Update-Database?
您要在這里做什么是重要的問題。 我很確定您不希望刪除並重新創建/重新創建生產環境中的數據庫(盡管有可能)。
您可能需要使用某種DBInitializer來滿足您的需求。 這是我幾個月前進行研究時使用的教程 。 您有3個默認選項( CreateDatabaseIfNotExExists , DropCreateDatabaseIfModelChanges , DropCreateDatabaseAlways ),當然還有自定義功能。
可用的另一個選項是編寫自定義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("john.doe@email.com") == 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 = "john.doe@email.com", UserName = "john.doe@email.com.com" };
if (userManager.Create(superuser1, "P@ssword123").Succeeded)
{
userManager.AddToRole(superuser1.Id, "Superuser");
}
}
context.SaveChanges();
}
}
到目前為止,據我了解,我必須始終運行Update-Database才能更新架構,以便其反映我新添加的模型。
您可以從程序包管理器控制台,初始化程序或代碼中運行遷移。
PM> Update-Database
Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppContext, Configuration>());
或DbMigrator(new Configuration()).Update()
new DbMigrator(new Configuration()).Update();
但是現在我只是設法創建了POCO模型,將DbSet Foos {get; set;}添加到我的ApplicationDbContext中,重新構建了應用程序,並且一切都神奇地起作用了。
如果您已經退出數據庫,並且模型中發生了新的變化,例如通過添加新的DbSet<T>
或僅添加新的屬性,而未設置任何初始化程序/遷移(在代碼或配置中),則應獲取錯誤之類的。
自創建數據庫以來,支持“ AppContext”上下文的模型已更改。 考慮使用“代碼優先遷移”來更新數據庫。
您可能已經設置了使用MigrateDatabaseToLatestVersion
並設置了AutomaticMigrationsEnabled = true;
。
然后打開自動遷移並始終調用Update-Database進行遷移,但這似乎根本沒有必要嗎?
是的,一旦啟用了自動遷移,就不再需要了。
能夠根據我的POCO模型生成數據庫架構的步驟是什么?
如果要手動維護數據庫版本:
DbMigrationsConfiguration<TContext>
派生的配置類,或僅使用PMC PM> Enable-Migrations
DbMigration
,或者僅使用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>());
更多
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.