我想要一个强类型数据集和设计器 TableAdapter,但 Visual Studio 的数据集设计器会生成特定于提供程序(例如 SQL Server 与 MySql)的代码,我不想只提交给一个提供程序。 ORM 会有所帮助,但是:
- Entity Framework 仅为 3.5,不能很好地与 DataSet 配合使用,并且
- NHibernate 不支持 SQLite。
这是我想出的:
“DataSets.Masters”包含绑定(bind)到某个特定提供程序(例如 SqlClient)的完全设计的数据集,包括:
- 一个 CustomTableAdapter 组件,由每个设计器 TableAdapter 子类化,
- ITableAdapterManager 接口(interface),由设计师的 TableAdapterManager 实现,用于分层更新。
DataSets.MyDataSetTableAdapters 命名空间除外的所有内容都被复制到“DataSets”项目中,其中删除了所有 TableAdapter 代码(连同 xs:annotation)。
DataSets.MyDataSetTableAdapters 命名空间连同 MyDataSet.xsd 等被复制并定制到“DataSets.SqlClient”、“DataSets.SQLite”等中。每个引用“数据集”程序集。
现在我只需要根据任何给定的连接字符串选择正确的程序集来加载我的 ITableAdapterManager 实现。当表架构发生变化时,我修改 Masters 程序集,将代码复制到生产程序集,并运行一些测试。
所以我的问题是:我是不是把它弄得太难了? DataSet 如此标准,通过数据访问层支持多个数据库引擎的需求如此普遍,有没有一种方法不涉及复制、粘贴和搜索和替换? 你是做什么的?
最佳答案
简单地忽略自动生成的 TableAdapter 命令并使用 ADO.Net data access factory objects 可能更容易何时进行 CRUD 操作。这样您就可以使用 DbProviderFactory.CreateCommandBuilder 正确格式化 CRUD 操作中的参数。请注意,这假设您没有进行任何棘手的属性映射,并且您的模式将在数据提供者之间保持一致。
如果您使用此技术,还有一个选项是创建一个类,您可以将其作为 TableAdapter 的 BaseClass 属性输入。添加一个“init”类型的方法,用工厂中的方法覆盖连接和插入、删除、选择和更新命令(基于自动生成的选择命令——应该兼容大多数提供商)。
关于c# - 每个数据库提供程序具有一组 TableAdapter 的强类型数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484851/