1

CodeFluent のブログ投稿 ( http://blog.codefluententities.com/2014/12/04/multi-tenant-using-multiple-schema/ ) で説明されているように、CFE を使用してテナントごとに 1 つのスキーマを生成しようとしています。このシナリオでは、生成される各スキーマが同一であると想定し、ICodeFluentPersistence フック システムを使用してユーザーの会社を識別し、使用するスキーマを適切に設定します。これらはすべて正常に機能しますが、コードを実行して複数のスキーマを生成すると ( https://github.com/SoftFluent/CodeFluent-Entities/tree/master/Extensions/SoftFluent.MultiTenantGenerator)、制約を削除しています。次に、構成に問題があるかどうかを確認しようとしましたが、GitHub からサンプル プログラムを実行しても同じ結果が得られました。サンプル プログラムを実行した後、主キーは dbo スキーマ (およびモデル) で適切に定義されていたにもかかわらず、contoso スキーマに存在しませんでした。

スキーマ生成後の結果

誰かが CFE マルチスキーマ ジェネレーターを使用したことがありますか、または問題が何であるかについての洞察を持っていますか?

4

2 に答える 2

0

マルチスキーマ ジェネレーターはモデルを読み込み、動的に変更してエンティティのスキーマを変更します。次に、データベース プロデューサー (SQL Server、Oracle など) のみを使用して標準コード生成プロセスを呼び出します。

したがって、空のデータベースに対して 2 つの異なるスキーマ (dbo と contoso) を生成する場合、プロセスは次のようになります。

  1. 空のデータベースから dbo スキーマのデータベースを生成します
  2. 以前に生成されたデータベースから contoso スキーマのデータベースを生成します

制約を作成する前に、SQL Server 差分エンジンは同じ名前の制約を削除します。実際、SQL Server では 2 つの制約に同じ名前を付けることはできません (MSDN で詳細が記載されたページが見つかりません)。そのため、PK の名前が dbo スキーマに存在する名前と同じであるため、contoso スキーマを生成するときに既存の PK が削除されます。これは改善される可能性がありますが、差分エンジンは SQL Server 2000 から SQL Server 2016 で機能するコードを生成しようとします。

回避策

異なるデータベースで各スキーマを生成できるため、差分エンジンは期待どおりのコードを生成します。次に、生成されたスクリプトを本番データベースで実行できます。最も簡単な方法ではありませんが、うまくいくはずです。

パッチ プロデューサーを使用して、ファイル内のスキーマの名前を置き換えることができます。SQL ファイルの場合は、 KnowledgeBaseSqlServerPatchProducerのas Explain を使用する必要があります。

namespace Sample
{
    public class SqlServerPatchProducer : SqlServerProducer
    {
        public SqlServerPatchProducer()
        {
        }

        protected override void RunProceduresScript()
        {
            string path = GetPath(Project.DefaultNamespace + "_procedures.sql");
            ProduceFrom(path, "before");
            SearchAndReplaceProducer.ProducePatches(Project, null, this, null, ProductionFlags, Element);
            Utilities.RunFileScript(path, Database, OutputEncoding);
            ProduceFrom(path, "after");
        }
    }
}
于 2015-12-07T15:26:59.553 に答える