OP さんが書きました:
しかし、Add-Migration には、DbContext と構成から必要なものがすべて揃っているのではないでしょうか?
いいえ - 他の人がここで述べたように、手動移行のコードのデザイナー部分 (によって作成されたものadd-migration
) には、データベース スキーマのスナップショットが含まれています。
そうは言っても、接続文字列などを使用しているという事実は非常に奇妙です。EF は通常、DbContext クラスと Web.Config からそれを暗示します。1 つのデータベースと 1 つの DbContext を持つプロジェクトで、構成クラスを作成し、次を使用して手動移行を追加します。
add-migration
他のコマンド ライン引数を渡す必要はありません。それは EF 4.3.1 にあります。おそらく、CTP または古いバージョンを使用していたのでしょうか、それとも単にドキュメントを誤解していたのでしょうか?
複数の DB または DbContext がある場合、複数の構成クラスがあり、たとえば次のように使用します。
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 db マシンでポートを開き、次を実行することで、DB の変更をローカル マシンからサーバーに簡単にデプロイできます。
> update-database -conf Log
パッケージ マネージャー コンソールで。