我们正在尝试使用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架构中也不存在主键。
是否有人使用过CFE Multi-Schema生成器或者对问题可能有什么了解?
答案 0 :(得分:0)
多模式生成器加载模型并动态更改它以修改实体的模式。然后它只用数据库生成器(SQL Server,Oracle等)调用标准代码生成过程。
因此,如果要针对空数据库生成2个不同的模式(dbo和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)