2009-01-27 31 views
2

我想要一個強類型的DataSet以及設計器TableAdapters,但Visual Studio的DataSet設計器生成特定於提供者(例如SQL Server vs. MySql)的代碼,我不想只提交給一個提供者。一個ORM會有所幫助,但:強類型DataSet和每個數據庫提供者的一組TableAdapter?

  • 實體框架是隻有3.5,沒有發揮好與數據集,並
  • NHibernate的不支持的SQLite。

這是我想出來的:

「DataSets.Masters」 包含了完全設計數據集綁定到某些特定的提供者(例如SqlClient中),包括:

  • 一個CustomTableAdapter組件,由每個設計者分類TableAdapter,
  • ITableAdapterManager in由設計者的實施,用於分層更新的TableAdapterManager

一切除了DataSets.MyDataSetTableAdapters命名空間將被複制到「數據集」項目中,所有的TableAdapter碼(XS與沿:註釋)被刪除。

DataSets.MyDataSetTableAdapters命名空間,與MyDataSet.xsd等一起,被複制並定製成每個「DataSets.SqlClient」,「DataSets.SQLite」等,它們各自的引用「數據集」的組件。

現在我只需要根據任何給定的連接字符串選擇正確的程序集來加載我的ITableAdapterManager實現。當表格架構發生變化時,我修改了大師裝配,將代碼複製到生產裝配,並運行一些測試。

所以我的問題:我讓這太難了嗎? DataSets是如此標準,並且需要通過數據訪問層支持多個數據庫引擎如此普遍,是否有一種方法不涉及複製,粘貼和搜索&替換? 做什麼?

回答

1

簡單地忽略自動生成的TableAdapter命令並在您的CRUD操作時間使用ADO.Net data access factory objects可能會更容易。這樣,您可以使用DbProviderFactory.CreateCommandBuilder正確地格式化CRUD操作中的參數。請注意,這假定您沒有進行任何棘手的屬性映射,並且您的模式將在數據提供者之間保持一致。

如果您使用這種技術,一個附加選項是創建一個類,您可以在TableAdapters上將其作爲BaseClass屬性輸入。添加一個「init」類型的方法,覆蓋連接和插入,刪除,選擇和更新命令與出廠命令(基於自動生成的選擇命令—,其中應該應該在大多數提供程序兼容)。

+0

我喜歡這個想法,聽起來像Maurice de Beijer描述的那樣:http://www.theproblemsolver.nl/dbproviderfactory/ 我避開了這個,因爲我不想依靠自己的算法來翻譯SQL方言之間,因爲搜索和替換SQL字符串感覺不對。如果.. – 2009-01-27 22:42:17

1

NHibernate確實支持SQLite http://www.hibernate.org/361.html

我推薦使用NHibernate結合​​。流利的NHibernate是一個庫,允許你使用NHibernate,而不需要自己處理任何xml,這在我看來是NHibernate最大的缺點。

也流利NHibernate支持自動持久性模型,如果你的域對象接近你的數據庫模式,你可以自動映射整個業務域,而無需爲每個對象編寫映射代碼。業務對象與數據庫的差別越大,使用Fluent NHibernate的自動映射功能就越複雜,值得使用靜態映射。