Dot-Net

生成 LINQ to DB2?

  • January 3, 2014

我的工作中有一個現有的 DB2 數據庫。(至少,我認為它是 DB2。他們稱它為“iSeries”,它在某些大型機硬體上看起來和感覺上都像 DB2。)多年來,我所在部門的 .NET 開發人員只是手動編寫 ADO 命令和查詢從特定表中獲取特定數據等

目前,我正在建構一些基礎設施來幫助簡化我們內部軟體的開發和支持,而我想要解決的一件事就是數據訪問。我對那裡的各種 ORM 工具有點陌生,但我熟悉 LINQ 語法,這就是我想要了解的地方。這就是我們現在所擁有的:

  1. 具有許多表的已建立 DB2 數據庫。
  2. 程式碼中沒有已建立的業務對象。
  3. 表和任何潛在業務對象之間沒有有用的關係。

所以我想做的是在程式碼和 DB2 數據庫之間創建一個抽象層,開發人員可以在其中更流暢、更高效地完成他們已經在做的事情(獲取數據和填充自定義對象)。也就是說,無需創建經典 ADO 對象並填充 DataSet,只需編寫一個簡單的 LINQ 語句,該語句返回一個匿名 IQueryable,其中包含用於填充自定義對象的欄位。(作為一個額外的獎勵,我真的很喜歡當程序員搞砸一些東西而不是執行時錯誤時編譯時錯誤的想法,就像當錯字進入 SQL 命令字元串文字時發生的那樣。另外,甚至不要讓我從這裡的 SQL 注入漏洞開始。)

問題是,我還沒有找到任何方法來實現這一點。我完全有可能忽略了一些簡單的事情,如果是這種情況,那麼我歡迎在正確的方向上稍微推動一下。但就目前而言,我在網上找到的所有內容都屬於以下類別之一:

  1. 是的,你可以做到這一點!您只需要一個沒有下載連結的 IBM 驅動程序!
  2. 這是一個方便的教程,用於為從頭開始創建數據庫的業務對像生成出色的 ORM。(NHibernate,主要是,如果我可以用它來做我想做的事情,那會很好用。)
  3. 下載一些工具並生成您的 ORM。(工具不支持 DB2,或者聲稱支持但在我嘗試時失敗。)

有沒有人遇到過這樣的事情?我是否以完全錯誤的方式接近它?任何關於此事的建議將不勝感激,謝謝。

編輯:我要繼續賞金這個。我已經和一些人談過了,聽起來“它還不能完成”仍然是可行的答案,但如果有人解決了這個問題並找到了解決方案,我很樂意聽到它。

更新:感謝下面的答案將我指向 DB_Linq 項目。實際上,我並沒有花太多時間為此添加一些基本的 DB2 支持,現在我有了一個經過測試且可以工作的 LINQ to DB2 提供程序!目前它非常簡單,並且非常適合我們的環境,因此還沒有計劃將其貢獻回項目中。但希望我能夠隨著時間的推移使我的叉子成熟並將其寄回。謝謝!

如果您不堅決反對進行一些編碼:-) 將LINQ 導入 MySql、Oracle 和 Postgress並對其進行修改可能也會為您節省大量工作。請記住,LINQ to SQL 仍然使用相同的 ADO.NET 連接。

請注意,LINQ to Entities 與 LINQ to SQL 不同,即使您讓 IBM lib 工作,您首先必須檢查是否允許您在沒有大量校對的情況下對現有數據庫使用它(它可以輕鬆旅行並嘗試修改現有數據庫 - 如果您想深入了解該方面,請查看此執行緒:http: //social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/f3a5b27a-5b73-476a -8c38-1eaedc8f197c)。

您還可以轉到IBM 的 Entity Framework Beta 執行緒(從一些 ppl 聲稱工作結果的末尾開始)。

重要的是不要試圖獲得 MS SQL 獲得的所有東西——你只需要表表示類,你就可以參加第一輪了。

您可以嘗試的另一件事是打開到 DB2 的正常 ADO.NET 連接(或者如果發現非 ODBC 連接過於窺探和敏感,則強制使用 ODBC)到 DB2,並嘗試像 SQL Server 一樣行事。如果事實證明SqlMetal同意使用該連接,您就完成了 - 它會為您自動生成表表示類。

如果它猶豫不決,您還需要 MS SQL Server,至少用於開發目的。對於從 DB2 中提取幾個表的啟動腳本,然後在 SQL Server 中創建,然後執行 SqlMetal 並查看原始碼。您會看到它為表表示創建了漂亮的氏族類,並且只是在它們上放置了大量但直接的屬性——這意味著易於複製和粘貼,甚至可以通過好的腳本生成。一旦您看到一個小的自動生成文件的樣子,您還會看到您可以將更多程式碼附加到提供的掛鉤或刪除一些現有程式碼。再次檢查LINQ to MySql 等

LINQ 本身只需要表表示類,因此您可以相當自由地根據自己的意願製作自己的 System.Data.Linq.DataContext 派生類,我認為 DB2 中的模式幾乎不會更改,因此您不需要更改它太頻繁了。LINQ 通常是非常開放的系統(正如許多LINQ to something libs 所證明的那樣),這意味著如果修改 DataContext 派生還不夠,您也可以接管整個 LINQ 表達式。

一旦你有幾個表的概念證明,你可能需要編寫一個 perl 或 python 腳本(或 powershell 或 C#)來做一些正則表達式替換,如果 DB2-s 表創建腳本沒有在 SQL Server 上完整執行(有總是有一些語法偏差)並且您確實採取了最合理的路線。

引用自:https://stackoverflow.com/questions/3290167