2015-12-07 158 views
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運行示例程序產生相同的結果。運行示例程序後,即使在dbo模式(和模型中)中正確定義了主鍵,contoso模式中也不存在主鍵。多租戶架構生成器故障示例

Results after generating schema

有沒有人使用的CFE多模式發生器或有任何洞察問題可能是什麼?

回答

0

多模式生成器加載模型並動態更改模型以修改實體的模式。然後它調用標準的代碼生成過程,只使用數據庫生產者(SQL Server,Oracle等)。

所以,如果你想生成2型動物模式(DBO和CONTOSO)對一個空數據庫,過程如下:

  1. 從一個空數據庫生成的DBO模式的數據庫
  2. 生成來自先前生成的數據庫的contoso模式的數據庫

在創建約束之前,SQL Server diff引擎會刪除具有相同名稱的約束。事實上,SQL Server不允許2個約束具有相同的名稱(我無法在MSDN上找到關於該頁面的更多詳細信息)。因此,在您的情況下,當您生成contoso模式時,現有的PK會被刪除,因爲PK的名稱與dbo模式中存在的名稱相同。也許這可以改善,但差異列表引擎試圖生成的SQL Server 2000工作於SQL Server 2016

變通辦法代碼

您可以生成不同的數據庫每個模式,所以diff文件引擎會生成你期望的代碼。然後,您可以在生產數據庫上運行生成的腳本。不是最簡單的方法,但它應該工作。

您可以使用補丁生產者來替換文件中架構的名稱。對於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"); 
     } 
    } 
} 
+0

你有沒有機會看看上面的答案?我完全脫離基地嗎? – user2589758

+0

我在答案中添加了兩個解決方法 – meziantou

0

謝謝,但我不知道,我同意。使用Multi-Tenant生成器的全部原因(至少在我之中)是從一個CFE模型中根據需要創建儘可能多的數據庫模式(每個客戶端一個)。除了其中一個之外,你會失去約束的想法並不合適,所以我做了一些更多的調查,並在Kalen Delaney和Craig Freeman的「Microsoft SQL Server 2012 Internals」中找到以下內容(通過谷歌圖書): enter image description here

而且實際上能夠做一個快速的測試通過創建具有相同的PK名稱的兩個相同的表證明瞭這一點:

enter image description here

所以它會出現,我認爲CFE應該能夠從同一個模型創建兩個相同的數據庫,似乎指向SQLServer diff引擎中的一個缺陷。