OP写道:
但是 Add-Migration 不是从 DbContext 和配置中获得了它需要的一切吗?
不 - 正如其他人在这里提到的那样,手动迁移代码的设计器部分(由 创建的add-migration
)包含数据库模式的快照。
也就是说,您使用连接字符串等的事实非常奇怪。EF 通常从您的 DbContext 类和 Web.Config 中暗示它。在我有一个数据库和一个 DbContext 的项目中,我创建了一个配置类并添加了一个手动迁移:
add-migration
我不必传递任何其他命令行参数。那是在 EF 4.3.1 中 - 也许您使用的是 CTP 或某些旧版本,或者只是误解了文档?
如果我有多个 DB 或 DbContexts,那么我有多个配置类并使用例如:
add-migration -conf Log
它使用我的配置类和 Web.config 中的相关连接字符串来为该数据库/DbContext 添加手动迁移。
这是一个用于存储日志的简单 DbContext 的较长代码示例(与主数据库分开):
namespace MyProj.Models.Log
{
public class LogDb : DbContext
{
public DbSet<LogLine> LogLines { get; set; }
public DbSet<LogTag> LogTags { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
public LogDb()
#if DEPLOYDB
: base("LogDeploy")
#else
: base()
#endif
{
}
}
namespace MyProj.Migrations
{
internal sealed class Log : DbMigrationsConfiguration<LogDb>
{
public Log()
{
AutomaticMigrationsEnabled = true;
}
}
}
在 Web.Config 中:
<add name="LogDb" connectionString="Initial Catalog=Log;Data Source=.\SqlExpress;Integrated Security=SSPI;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
<add name="LogDeploy" connectionString="Initial Catalog=Log;Data Source=00.00.000.00,12345;User ID=sql;Password=xxx;Network Library=DBMSSOCN" providerName="System.Data.SqlClient" />
所以在这个例子中,我有多个数据库,多个 DbContext。LogDb 根据是否在编译时定义了“DBDEPLOY”,在 Web.Config 中使用不同的连接字符串;如果是,它使用“LogDeploy”。如果不是,它使用默认值 - 与类同名的连接字符串“LogDb”。这允许我通过切换我的项目配置、在 SQL 数据库机器上打开一个端口并运行,轻松地将数据库更改从我的本地机器部署到服务器:
> update-database -conf Log
在包管理器控制台中。