2009-01-27 28 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的自动映射功能就越复杂,值得使用静态映射。