2009-02-24 50 views
6

我有一個數據庫和一個由O/R-Mapper創建的實體集,所有這些都與LINQ一起使用。如何在運行時更改LINQ O/R-M表名/源?

在O/R映射程序中,我需要爲每個表輸入一個表名(源),這個表用於LINQ生成的SQL。在.dbml文件,它看起來像這樣:

<Table Name="dbo.Customers" Member="Customers"> 

現在,我想在運行時更改此表的名稱,所以SQL將針對一些其他的表運行(customers2008而不是客戶,例如)。

有什麼辦法可以在運行時更改表名(源名)嗎?

經過一些測試後,我不得不發現XmlMappingSource確實會呈現計算屬性,這些屬性在數據庫中不存在不可訪問(是的,即使由SqlMetal創建的映射也會忽略所有未被保留的映射)。

回答

7

的......那種你不得不做這樣的事情:

  1. 在設計師創建實體。
  2. 使用SqlMetal從設計器生成的.dbml文件生成一個xml映射文件。
  3. 更新xml文件中的表名。
  4. 然後在您的代碼中,使用接受使用xml映射文件創建的XmlMappingSource的DataContext構造函數重載。

這裏有一個博客文章,解釋一步該工藝步驟: http://weblogs.asp.net/guybarrette/archive/2008/07/23/linq-to-sql-dynamic-mapping.aspx

我使用了一個類似的過程與具有類似ttccom001xxx其中xxx是安裝ID表名的ERP數據庫(我知道這是一個可怕的模式,但我無能爲力)。我們有多個安裝,因此我爲每次安裝複製初始xml映射一次,然後用安裝ID替換xxx。我編寫了一個小型控制檯應用程序,使用Regex來照顧替換,並將其添加爲構建過程的一部分。

+0

現在我只需要一種方法在運行時創建這個映射文件,所以我不必嘗試保持映射文件與數據類對齊。 – Sam 2009-02-25 09:34:59

+0

噢,我設法創建了這些文件,但是,它們不能按預期工作。現在沒時間了,明天會更多。 – Sam 2009-02-25 16:13:59

3

這是微軟的External Mapping Reference的鏈接。

外部映射覆蓋基於屬性的映射。

這是要領。

  1. 創建一些代表映射的xml。
  2. 新增了一個XmlMappingSource並給它你的xml。
  3. 構建DataContext時,請使用接受XmlMappingSource的構造函數,如this one