强类型DataSet,每个数据库提供程序有一组TableAdapter?

时间:2009-01-27 19:27:21

标签: c# database strongly-typed-dataset

我想要一个强类型的DataSet和设计器TableAdapters,但Visual Studio的DataSet设计器生成特定于提供者的(例如SQL Server vs. MySql)代码,我不想只提交一个提供者。 ORM会有所帮助,但是:

  • 实体框架仅为3.5,并且与DataSet和
  • 不相称
  • NHibernate不支持SQLite。

以下是我的想法:

“DataSets.Masters”包含绑定到某个特定提供程序(例如SqlClient)的完全设计的DataSet,包括:

  • CustomTableAdapter 组件,由每个设计人员 TableAdapter
  • 创建子类别
  • 一个 ITableAdapterManager 界面,由设计人员的 TableAdapterManager 实现,用于分层更新。

DataSets.MyDataSetTableAdapters 命名空间之外的所有都被复制到“DataSet”项目中,其中删除了所有TableAdapter代码(以及xs:annotation)。

DataSets.MyDataSetTableAdapters 命名空间以及MyDataSet.xsd等被复制并自定义到“DataSets.SqlClient”,“DataSets.SQLite”等每个中,每个引用“DataSet”组装。

现在,我必须根据任何给定的连接字符串选择正确的程序集来加载我的 ITableAdapterManager 实现。当表模式更改时,我修改Masters程序集,将代码复制到生产程序集,然后运行一些测试。

所以我的问题是:我是否太难了? DataSet是如此标准,并且需要通过数据访问层支持多个数据库引擎是如此常见,是否有一种方法不涉及复制,粘贴和搜索&更换? 做什么?

2 个答案:

答案 0 :(得分:1)

NHibernate确实支持SQLite http://www.hibernate.org/361.html

我建议将NHibernate与Fluent NHibernate结合使用。流畅的NHibernate是一个库,允许你使用NHibernate,而不需要自己处理任何xml,我认为这是NHibernate的最大缺点。

同样流畅的NHibernate支持自动持久性模型,如果您的域对象靠近数据库模式,您可以自动化整个业务域,而无需为每个对象编写映射代码。您的业​​务对象与数据库的差异越大,使用Fluent NHibernate的自动化功能就越复杂,值得使用静态映射。

答案 1 :(得分:1)

可能更容易忽略自动生成的TableAdapter命令,并在CRUD操作时使用ADO.Net data access factory objects。这样,您可以使用DbProviderFactory.CreateCommandBuilder正确格式化CRUD操作中的参数。请注意,这假设您没有进行任何棘手的属性映射,并且您的架构将在数据提供程序之间保持一致。

如果您使用此技术,那么aditional选项是创建一个类,您可以在TableAdapter上输入BaseClass属性。添加一个“init”类型的方法,该方法覆盖连接以及插入,删除,选择和更新命令与工厂中的命令(基于自动生成的select命令 - 兼容大多数提供者)。