Проблема с примером генератора многопользовательских схем

Мы пытаемся использовать CFE для создания одной схемы для каждого арендатора, как указано в сообщении блога CodeFluent (http://blog.codefluententities.com/2014/12/04/multi-tenant-using-multiple-схема/). В этом сценарии мы ожидаем, что каждая сгенерированная схема должна быть идентичной, и мы используем систему ICodeFluentPersistence Hook, чтобы идентифицировать компанию для пользователя, а затем правильно установить используемую схему. Все это работает нормально, но когда мы запускаем код для создания нескольких схем (https://github.com/SoftFluent/CodeFluent-Entities/tree/master/Extensions/SoftFluent.MultiTenantGenerator), он снимает ограничения. Затем я попытался проверить, не возникла ли проблема с моей конфигурацией, но запуск примера программы из GitHub дает те же результаты. После запуска примера программы первичный ключ отсутствовал в схеме contoso, хотя он был правильно определен в схеме dbo (и в модели).

Результаты после создания схемы

Кто-нибудь использовал генератор CFE Multi-Schema или знает, в чем может быть проблема?


person user2589758    schedule 07.12.2015    source источник


Ответы (2)


Спасибо за ответ, но я не уверен, что согласен. Вся причина (по крайней мере для меня) использования генератора Multi-Tenant состоит в том, чтобы создать столько схем базы данных, сколько необходимо (по одной на клиента) из одной модели CFE. Мысль о том, что вы потеряете ограничения во всех, кроме одного из них, казалась мне неправильной, поэтому я провел еще немного исследований и нашел следующее в «Microsoft SQL Server 2012 Internals» Кален Делани и Крейга Фримана (через Google Книги): введите здесь описание изображения

И на самом деле смог провести быстрый тест, чтобы доказать это, создав две идентичные таблицы с одинаковыми именами PK:

введите здесь описание изображения

Поэтому мне кажется, что CFE должен иметь возможность создавать две идентичные базы данных из одной и той же модели и, похоже, указывает на недостаток в механизме сравнения SQLServer.

person user2589758    schedule 07.12.2015

Генератор нескольких схем загружает модель и динамически изменяет ее, чтобы изменить схему объектов. Затем он вызывает стандартный процесс производства кода только с производителями баз данных (SQL Server, Oracle и т. д.).

Итак, если вы хотите сгенерировать 2 разные схемы (dbo и contoso) для пустой базы данных, процесс будет следующим:

  1. Создайте базу данных для схемы dbo из пустой базы данных.
  2. Создайте базу данных для схемы contoso из ранее созданной базы данных.

Перед созданием ограничения механизм сравнения SQL Server удаляет ограничение с тем же именем. На самом деле SQL Server не позволяет двум ограничениям иметь одно и то же имя (я не могу найти страницу в MSDN с более подробной информацией об этом). Таким образом, в вашем случае существующий ПК удаляется при создании схемы contoso, поскольку имя ПК совпадает с именем, которое существует в схеме dbo. Возможно, это можно улучшить, но модуль diffs пытается сгенерировать код, который работает для SQL Server 2000 и SQL Server 2016.

Временные решения

Вы можете сгенерировать каждую схему в другой базе данных, поэтому механизм diffs сгенерирует код, который вы ожидаете. Затем вы можете запустить сгенерированные сценарии в производственной базе данных. Не самый простой способ, но он должен работать.

Вы можете использовать производителя исправлений, чтобы заменить имя схемы в файле. Для файлов SQL вы должны использовать SqlServerPatchProducer, как описано в KnowledgeBase:

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");
        }
    }
}
person meziantou    schedule 07.12.2015
comment
У вас была возможность посмотреть ответ выше? Я совсем не в теме? - person user2589758; 11.12.2015