1

我正在使用EF遷移在運行時動態創建數據庫模型。這可能會發生很多次,有時會修改現有的表,有時不會。由於每次我進行遷移時,我都不想創建包含整個數據庫上所有DbSets的大規模上下文,我只想包括我當前正在修改的表。
我做遷移下列方式將EF配置爲不刪除遷移中的任何表

 Type contextType = null; //This will be my dbcontext 

     DbMigrationsConfiguration migratorConfig = new DbMigrationsConfiguration(); 

     migratorConfig.ContextType = contextType; 
     migratorConfig.TargetDatabase = new DbConnectionInfo("ConnectionString", "System.Data.SqlClient"); 
     migratorConfig.AutomaticMigrationsEnabled = true; 
     migratorConfig.AutomaticMigrationDataLossAllowed = false; 
     migratorConfig.ContextKey = "key"; 
     migratorConfig.MigrationsAssembly = contextType.Assembly; 

     DbMigrator dbMigrator = new DbMigrator(migratorConfig); 
     dbMigrator.Update(); 

有沒有什麼辦法可以配置EF不丟棄不包括上下文,但存在以前遷移的表?每次使用不同的ContextKey不是一種選擇,因爲EF會抱怨某個對象已經存在。
在此先感謝。

+0

爲什麼downvote? – user2697817 2015-03-04 10:42:29

+0

請不要多次編輯您的問題以獲得關注。如果你的問題的措辭正確,並顯示你的努力和你堅持的地方,那麼它將得到回答。有時候一些問題可能需要更多時間才能得到注意和回答。 – Krishna 2015-03-04 11:45:42

+0

@ user2697817實際上克里希納可能會倒下它,這可能是發生了什麼事。 – SOfanatic 2015-03-04 14:05:24

回答

0

您可以使用migrator.GetDatabaseMigrations();,它返回已經應用到數據庫的正確遷移列表。並使用以下由於得到掛起遷移:

var mg = new DbMigrator(configuration); 
var mgpen = mg.GetPendingMigrations().ToList(); 

而你可能想看看腳本通過這樣的:

var scriptor = new MigratorScriptingDecorator(mg); 
string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null); 

然後嘗試,看看/比較它們以滿足你的目的。您可能想要customize Migrations History Table肉這:) :)

注意:重命名ContextKey是有用的處理管理每個物理數據庫實例的多個模型。這是EF6移植被稱爲Multiple Contexts per Database的能力。根據MSDNContextKey

獲取或設置用於區分屬於 來自屬於使用相同的數據庫其它構造 遷移配置遷移的字符串。此屬性允許從多個不同模型的 遷移應用於應用於單個 數據庫。

0

這樣做的一種方法是使用手動遷移,但這將有點難以實現,但是如果您擁有較大的數據庫並且修改次數較少,則應該可以使用。

使用類似,

namespace MigrationsDemo.Migrations 
{ 
    using System; 
    using System.Data.Entity.Migrations; 

    public partial class AddBlogUrl : DbMigration 
    { 
     public override void Up() 
     { 
      AddColumn("dbo.Blogs", "Url", c => c.String()); 
     } 

     public override void Down() 
     { 
      DropColumn("dbo.Blogs", "Url"); 
     } 
    } 
} 

請找到更多的信息here