多租户模式生成器示例问题

时间:2015-12-07 03:05:37

标签: codefluent

我们正在尝试使用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运行示例程序会产生相同的结果。运行示例程序后,即使已在dbo架构(以及模型中)中正确定义了主键,contoso架构中也不存在主键。

Results after generating schema

是否有人使用过CFE Multi-Schema生成器或者对问题可能有什么了解?

2 个答案:

答案 0 :(得分:0)

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

因此,如果要针对空数据库生成2个不同的模式(dbo和contoso),则过程如下:

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

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

    <强>变通方法

    您可以在不同的数据库中生成每个架构,因此diffs引擎将生成您期望的代码。然后,您可以在生产数据库上运行生成的脚本。不是最简单的方法,但应该有效。

    您可以使用修补程序生成器替换文件中的架构名称。对于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"); } } } 作为解释:<{3}}:

    num = 5

答案 1 :(得分:0)

感谢您的回复,但我不确定是否同意。使用Multi-Tenant生成器的全部原因(至少是我)是根据需要从一个CFE模型创建所需数量的数据库模式(每个客户端一个)。除了其中一个之外你会失去约束的想法并没有让我感觉不对,所以我做了一些调查,并在&#34; Microsoft SQL Server 2012 Internals&#34;作者:Kalen Delaney和Craig Freeman(通过谷歌图书): enter image description here

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

enter image description here

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