1

我们正在尝试使用 CFE 为每个租户生成一个模式,如 CodeFluent 博客文章 ( http://blog.codefluententities.com/2014/12/04/multi-tenant-using-multiple-schema/ ) 中所述。在这种情况下,我们期望生成的每个模式都应该是相同的,并且我们正在使用 ICodeFluentPersistence Hook 系统为用户识别公司,然后正确设置要使用的模式。所有这些都可以正常工作,但是当我们运行代码来生成多个模式时(https://github.com/SoftFluent/CodeFluent-Entities/tree/master/Extensions/SoftFluent.MultiTenantGenerator),它正在消除约束。然后我尝试查看我的配置是否存在问题,但是从 GitHub 运行示例程序会产生相同的结果。运行示例程序后,主键不存在于 contoso 架构中,尽管在 dbo 架构(和模型)中正确定义了主键。

生成架构后的结果

有没有人使用过 CFE 多模式生成器或对问题可能有任何见解?

4

2 回答 2

0

多模式生成器加载模型并动态更改它以修改实体的模式。然后它只使用数据库生产者(SQL Server、Oracle 等)调用标准代码生成过程。

因此,如果您想针对空数据库生成 2 个不同的架构(dbo 和 contoso),过程如下:

  1. 从空白数据库为 dbo 模式生成数据库
  2. 从先前生成的数据库生成 contoso 架构的数据库

在创建约束之前,SQL Server 差异引擎会删除具有相同名称的约束。事实上,SQL Server 不允许 2 个约束具有相同的名称(我在 MSDN 上找不到包含更多详细信息的页面)。因此,在您的情况下,生成 contoso 架构时会删除现有的 PK,因为 PK 的名称与 dbo 架构中存在的名称相同。也许这可以改进,但差异引擎会尝试生成适用于 SQL Server 2000 到 SQL Server 2016 的代码。

解决方法

您可以在不同的数据库中生成每个模式,因此差异引擎将生成您期望的代码。然后您可以在生产数据库上运行生成的脚本。不是最简单的方法,但它应该工作。

您可以使用补丁生成器来替换文件中的模式名称。对于 SQL 文件,您应该使用知识库SqlServerPatchProducer中的解释:

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 回答
0

感谢您的回复,但我不确定我是否同意。使用多租户生成器的全部原因(至少对我来说)是从单个 CFE 模型创建所需数量的数据库模式(每个客户端一个)。除了其中一个之外,你会失去所有约束的想法感觉不对,所以我做了更多调查,并在 Kalen Delaney 和 Craig Freeman 的“Microsoft SQL Server 2012 Internals”中发现了以下内容(通过 Google Books): 在此处输入图像描述

事实上,可以通过创建两个具有相同 PK 名称的相同表来进行快速测试来证明这一点:

在此处输入图像描述

所以在我看来,CFE 应该能够从同一模型创建两个相同的数据库,并且似乎指向 SQLServer 差异引擎中的缺陷。

于 2015-12-07T23:09:26.973 回答