我想要一个强类型的DataSet和设计器TableAdapters,但Visual Studio的DataSet设计器生成特定于提供者的(例如SQL Server vs. MySql)代码,我不想只提交一个提供者。 ORM会有所帮助,但是:
以下是我的想法:
“DataSets.Masters”包含绑定到某个特定提供程序(例如SqlClient)的完全设计的DataSet,包括:
除 DataSets.MyDataSetTableAdapters 命名空间之外的所有都被复制到“DataSet”项目中,其中删除了所有TableAdapter代码(以及xs:annotation)。
DataSets.MyDataSetTableAdapters 命名空间以及MyDataSet.xsd等被复制并自定义到“DataSets.SqlClient”,“DataSets.SQLite”等每个中,每个引用“DataSet”组装。
现在,我必须根据任何给定的连接字符串选择正确的程序集来加载我的 ITableAdapterManager 实现。当表模式更改时,我修改Masters程序集,将代码复制到生产程序集,然后运行一些测试。
所以我的问题是:我是否太难了? DataSet是如此标准,并且需要通过数据访问层支持多个数据库引擎是如此常见,是否有一种方法不涉及复制,粘贴和搜索&更换? 你做什么?
答案 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命令 - 应兼容大多数提供者)。