C# 每个数据库提供程序具有一组TableAdapter的强类型数据集?

C# 每个数据库提供程序具有一组TableAdapter的强类型数据集?,c#,database,strongly-typed-dataset,C#,Database,Strongly Typed Dataset,我想要一个强类型数据集和designer TableAdapters,但VisualStudio的数据集设计器会生成特定于提供程序的代码(例如SQL Server和MySql),我不想只提交给一个提供程序。ORM会有所帮助,但: 实体框架仅为3.5版本,不能很好地处理数据集,并且 NHibernate不支持SQLite 以下是我的想法: “DataSets.Masters”包含一个完全设计的数据集,绑定到某个特定的提供者(例如SqlClient),包括: 一个自定义TableAdapter

我想要一个强类型数据集和designer TableAdapters,但VisualStudio的数据集设计器会生成特定于提供程序的代码(例如SQL Server和MySql),我不想只提交给一个提供程序。ORM会有所帮助,但:

  • 实体框架仅为3.5版本,不能很好地处理数据集,并且
  • NHibernate不支持SQLite
以下是我的想法:

“DataSets.Masters”包含一个完全设计的数据集,绑定到某个特定的提供者(例如SqlClient),包括:

  • 一个自定义TableAdapter组件,由每个设计器TableAdapter子类化
  • 一个ITableAdapterManager接口,由设计师的TableAdapterManager实现,用于分层更新
除了DataSets.MyDataSetTableAdapters命名空间之外的所有内容都复制到“DataSets”项目中,在该项目中删除所有TableAdapter代码(以及xs:annotation)

DataSets.mydatasetableadapters名称空间以及MyDataSet.xsd等被复制和自定义到“DataSets.SqlClient”、“DataSets.SQLite”等中。每个名称空间都引用“DataSets”程序集

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


所以我的问题是:我是不是让这太难了?数据集是如此标准,通过数据访问层支持多个数据库引擎的需求如此普遍,有没有一种方法不涉及复制、粘贴和搜索&替换?你是做什么的?

NHibernate确实支持SQLite

我建议结合使用NHibernate。Fluent NHibernate是一个库,允许您使用NHibernate而无需自己处理任何xml,我认为这是NHibernate最大的缺点


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

简单地忽略自动生成的TableAdapter命令,并在CRUD操作开始时使用。这样,您就可以使用DbProviderFactory.CreateCommandBuilder正确格式化CRUD操作中的参数。请注意,这假设您没有进行任何复杂的属性映射,并且您的模式将在数据提供程序之间保持一致


如果使用此技术,一个传统的选项是创建一个类,您可以在TableAdapters上输入该类作为基类属性。添加一个“init”类型的方法,该方法使用出厂的命令覆盖连接和插入、删除、选择和更新命令(基于自动生成的select命令,应该与大多数提供商兼容)。

我喜欢这个想法,这听起来像Maurice de Beijer所描述的:我回避这一点,因为我不想依靠自己的算法在SQL方言之间进行翻译,也因为对SQL字符串进行搜索和替换感觉不对。如果..如果我能确定我正确地实现了它,这将是对我来说最好的解决方案。SQL方言之间的转换由DbProvider工厂的CommandBuilder处理。它接受select语句并生成相应的Delete和Update命令。哇!一开始我不相信你,我不知道CommandBuilder会这么做。参数仍然是一个问题,但我认为我可以处理它。。。