スキーマ名が移行コードに含まれているため、Oracleデータベースを対象としたEntity Frameworkの移行を使用する際に問題があり、スキーマ名もユーザー名です。私の目標は、スキーマに依存しないCode First Migrations(テスト環境と本番環境用に1組の移行を行うことができるようにすること)です。スキーマに依存しないエンティティフレームワークコードの最初の移行
私はすでに(Entity Frameworkの6.1.3を使用して)このアプローチを試してみました:
1)私は、Web.configファイルでスキーマ名を持っている:
<add key="SchemaName" value="IPR_TEST" />
2)私のDbContextはとしてスキーマ名を取りますコンストラクタのパラメータ:
public EdistributionDbContext(string schemaName)
: base("EdistributionConnection")
{
_schemaName = schemaName;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema(_schemaName);
}
3)私は、パラメータなしのコンストラクタを持っていない私のDbContextを作成できるようにEntity Frameworkの移行のためのIDbContextFactoryを実装する必要がありました:
public class MigrationsContextFactory : IDbContextFactory<EdistributionDbContext>
{
public EdistributionDbContext Create()
{
return new EdistributionDbContext(GetSchemaName());
}
}
4)私はまた、正しいスキーマ内に配置される移行履歴表を構成:
public class EdistributionDbConfiguration : DbConfiguration
{
public EdistributionDbConfiguration()
{
SetDefaultHistoryContext((connection, defaultSchema)
=> new HistoryContext(connection, GetSchemaName()));
}
}
5)Iは、ハードコードスキーマ名を置換する移行用に生成されたコードを修正しました。例えば。私はCreateTable("IPR_TEST.Users")
をCreateTable($"{_schema}.Users")
に置き換えました。 (_schema
フィールドはWeb.configの値に従って設定されます)。
6)私はMigrateDatabaseToLatestVersion<EdistributionDbContext, MigrationsConfiguration>()
データベース初期設定を使用します。
この設定をすべて行っても、別のスキーマ(web.config変換など)に切り替えると問題は残っています。データベースが自分のモデルと一致せず、AutomaticMigrationsが無効になっているという例外がスローされます。希望)。私は新しいマイグレーションが発生したadd-migration
を実行しようとすると、すべてのオブジェクトが別のスキーマに移動しなければならない場所(例:。確かに望まれていないMoveTable(name: "IPR_TEST.DistSetGroups", newSchema: "IPR");
、私にとって
は、そのスキーマ名がハードワイヤードモデル文字列のどこかにあるようですマイグレーションクラスで-hash(例えば201509080802305_InitialCreate.resx。)、すなわち:そこ
<data name="Target" xml:space="preserve">
<value>H4sIAAAAAAAEAO09227jO... </value>
</data>
これは、スキーマ名を無視するように、コードファーストの移行を指示する仕方
これを試したことがありますが、SQLサーバーでモデルバインディングでスキーマを指定しないと、ユーザーの既定のスキーマだけが使用されます。 –
ありがとうございます@ベン、あなたのコメントは私の問題の解決につながる可能性があります。 'modelBuilder.HasDefaultSchema(" SCHEMA_NAME ");を省略すると、Entity Frameworkはデフォルトのスキーマとして" dbo "を設定します。しかし、今では 'modelBuilder.HasDefaultSchema(string.Empty);'を試しましたが、ユーザーのデフォルトスキーマが(正しく)使用されているようです。残念ながら、移行のSQLを生成するために使用される 'Oracle.ManagedDataAccess.EntityFramework.OracleMigrationSqlGenerator'は、' string.Empty'-schema-nameに問題があり、移行のSQLを生成するときに例外をスローします...しかし、それは別の問題です... –
こんにちはJan Palas、この問題についての解決策はありますか?私は同じ問題を抱えていますが、私はOracleでEF Migrationを使用しています。スキーマを変更すると、すべての移行スクリプトにMoveTableが含まれています... – toregua