我们在SCM下有一个项目.当我从我的机器构建它并通过msdeploy发布到远程服务器时,一切正常.
当我的同事用同一个项目尝试相同的事情时,从SCM新推出,在远程服务器实体框架4.3.1上DbMigrator抛出:
未应用自动迁移,因为它会导致数据丢失.
事实证明,初始发布到远程服务器的人似乎是"赢家".如果我们将数据库放在远程服务器上,那么我的同事可以发布并且我被锁定了.我的出版物导致上述相同的错误.
配置DbMigrator看起来像这样:
var dbMgConfig = new DbMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true,
//***DO NOT REMOVE THIS LINE,
//DATA WILL BE LOST ON A BREAKING SCHEMA CHANGE,
//TALK TO OTHER PARTIES INVOLVED IF THIS LINE IS CAUSING PROBLEMS
AutomaticMigrationDataLossAllowed=false,
//***DO NOT REMOVE THIS LINE,
ContextType = typeof(TPSContext),
MigrationsNamespace = "TPS.Migrations",
MigrationsAssembly = Assembly.GetExecutingAssembly()
};
Run Code Online (Sandbox Code Playgroud)
我认为这与新表__MigrationHistory和存储在其行中的令人讨厌的长十六进制字符串有关.
我不想对出版生活承担全部责任.我能指出什么?
c# entity-framework ef-code-first entity-framework-4.3 dbmigrator
我正在使用DbMigrator该类来获取待处理迁移的列表.由于某种原因,即使存在待定迁移,它也不会返回任何项目.我错过了一步吗?
var configuration = new Migrations.Configuration();
configuration.TargetDatabase = new DbConnectionInfo("MyDatabase");
var migrator = new DbMigrator(configuration);
var migs = migrator.GetPendingMigrations().ToList();
Console.WriteLine(migrator.GetPendingMigrations().ToString());
Run Code Online (Sandbox Code Playgroud)
我认为它可能是连接字符串,但有趣的是migrator.GetDatabaseMigrations()返回已应用于db的正确迁移列表.
如何在没有在所需的无参数构造函数的基础上对nameorconnectionstring进行硬编码的情况下使EF迁移工作?
EF迁移强制您向自定义dbcontext添加默认构造函数.在dbcontext的基础中,您必须提供nameorconnectionstring.
public class CustomDbContext : DbContextBase
{
public CustomDbContext ()
: base("theconnectionstringwedontwanttoset") //hardcoded connection string
{
}
Run Code Online (Sandbox Code Playgroud)
我们需要对构造函数进行硬编码这一事实是我们无法使用的,因为在我们的客户端应用程序中,我们在没有配置文件的情况下工作,并且我们动态建立连接,因为我们连接到许多不同的数据库(服务器,本地sql compact).
在探索DbMigrationsConfiguration类之后,我找到了一个名为TargetDatabase的DbConnectionsInfo属性,可以在构造函数中设置它.但即使这个解决方案也行不通.这就是我做的:
public sealed class Configuration : DbMigrationsConfiguration<CustomDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
//Setting the TargetDatabase in the hope it will use it in the migration
TargetDatabase = new DbConnectionInfo("Server=xxx;Database=xxx;Trusted_Connection=True", "System.Data.SqlClient");
}
public class MigrationInitializer : MigrateDatabaseToLatestVersion<CustomDbContext, Configuration>
{
}
Run Code Online (Sandbox Code Playgroud)
我可以看到最终在DbMigrator中使用了Activator.CreateInstance,我期望从这个类中使用TargetDatabase.Create ...或者其他东西.
欢迎任何帮助或反馈.
提前致谢,
Wilko
Platform .NET 4.5和Entity Framework 6.
问题 我有以下代码来执行迁移:
//The following function just returns an object of the Configuration() class
//generated by code migrations
var migratorConfig = currentMigrationProvider.CreateDbMigrationConfiguration();
var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(migratorConfig);
dbMigrator.Update();
Run Code Online (Sandbox Code Playgroud)
问题是Update()函数尝试创建我的DbContext类的实例,出于一些好的原因,我需要手动创建上下文并将其提供给dbMigrator.那可能吗?怎么样?