你不需要在安裝過程中運行遷移腳本 - 您的安裝需要太高的權限這樣做,你可能有安裝由系統管理員從主動應用包策略問題目錄。
Db的升級應用程序邏輯也是一樣,我相信它是屬於應用程序 - 而不是安裝程序。
當然你也可以在wix with custom actions做到這一點。但是你將不得不加載遷移所需的所有程序集 - 至少需要運行SQL命令。
我建議您在應用程序啓動時運行遷移。
這是一個剪裁,完成這項工作。首先讓我們來回顧一下上下文:
- 您在項目開發週期中創建了N個連續的遷移。
您可以使用EF工具從包管理器控制檯在Visual Studio或直接(你可以在NuGet包找到.exe文件)來創建局部(更新)遷移。之後您將在遷移程序集中編譯它們,以便將它們與您的應用程序一起帶到安裝程序的客戶端。舉個例子:。
添加遷移-Name SomeDbChangeDescription -StartUpProjectName TheCoreProjectWithConfig -ProjectName TheProjectWithMigrations -ConfigurationTypeName 「Fully.Qualified.Type.Name.Of.MigrationConfiguration」 -ConnectionString「數據源= \ SQLINSTANCE;數據庫=我-DB; Trusted_Connection = FALSE;用戶ID = XXX;密碼= XXX」 -ConnectionProviderName‘System.Data.SqlClient的’
記住,使用該腳本您1分貝產生遷移腳本,但以後可以把它在多個數據庫 - 當你有db-per-tenant時。如果源自同一模型,則不需要爲每個數據庫生成遷移腳本,因爲在生成過程中在遷移腳本中沒有硬編碼特定於DB的信息。
- 您可以編譯您的遷移程序集並確保它在安裝程序中,並且它在應用程序啓動時加載。
現在您可以使用(隨意修改)以下代碼。 dbMigrator.Update()將應用所有需要應用的遷移腳本 - 如果您在程序集中有10次遷移並且有2次未應用遷移,它將比較db的模型和所有遷移,並將僅應用最後2次遷移。如果使用不存在的數據庫名稱調用dbMigrator.Update()方法,它將創建應用初始腳本和所有其他部分更新的新數據庫。
public class DbInitializer : IDbInitializer
{
private readonly IConnectionStringProvider _connectionStringProvider;
public DbInitializer(IConnectionStringProvider connectionStringProvider)
{
_connectionStringProvider = connectionStringProvider;
}
public void CreateOrUpdateDb(string dbName)
{
try
{
string connectionString = _connectionStringProvider.GetConnectionString(dbName);
DbMigrationsConfiguration cfg = CreateMigrationsConfig(connectionString);
cfg.CommandTimeout = 900;
cfg.AutomaticMigrationsEnabled = false;
cfg.AutomaticMigrationDataLossAllowed = false;
DbMigrator dbMigrator = new DbMigrator(cfg);
var pendingMigrations = dbMigrator.GetPendingMigrations().ToArray();
if(pendingMigrations.Length > 0)
{
foreach(var pendingMigration in pendingMigrations)
{
InitializerEventSource.Log.UpgradingDb(dbName, pendingMigration);
}
dbMigrator.Update();
DbInitializerEventSource.Log.UpgradedDb(dbName);
}
}
catch(MigrationsException exception)
{
// exception handling
}
catch(Exception exception)
{
// exception handling
}
}
private DbMigrationsConfiguration<InitDbContext> CreateMigrationsConfig(string connectionString)
{
DbMigrationsConfiguration<InitDbContext> cfg = new DbMigrationsConfiguration<InitDbContext>
{
AutomaticMigrationsEnabled = false,
AutomaticMigrationDataLossAllowed = false,
MigrationsAssembly = Assembly.Load("TheAssemblyContainingTheMigrations"),
MigrationsNamespace = "TheNamespaceWhereTheMigrationsAre",
ContextKey = "HardCodedContexKey",
TargetDatabase = new DbConnectionInfo(connectionString, _connectionStringProvider.ProviderInvariantName)
};
return cfg;
}
}
UPDATE 你可以申請另一種方法 - 在開發過程中
- 使用上述AddMigration腳本,並添加-Script指令獲取SQL遷移腳本,而不是C#遷移腳本。
- 使用WIX Sql Extension在安裝過程中執行它。 The official Sql Extension for Wix Documentation.
您是指Entity Framework Code First遷移?如果是這樣,那麼在標題或問題本身中添加 –
是的 - 我添加了它。謝謝。 –