【问题标题】:Strongly Typed DataSet with a set of TableAdapters per database provider?每个数据库提供者都有一组 TableAdapter 的强类型数据集?
【发布时间】:2009-01-27 19:27:21
【问题描述】:

我想要一个强类型数据集以及设计器 TableAdapters,但 Visual Studio 的数据集设计器会生成特定于提供程序(例如 SQL Server 与 MySql)的代码,我不想只使用一个提供程序。 ORM 会有所帮助,但是:

  • Entity Framework 仅适用于 3.5,不能很好地与 DataSet 配合使用,并且
  • NHibernate 不支持 SQLite。

这是我想出的:

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

  • 一个 CustomTableAdapter 组件,由每个设计者子类化TableAdapter
  • 一个 ITableAdapterManager 接口,由设计者的 TableAdapterManager 实现,用于分层更新。

除了 DataSets.MyDataSetTableAdapters 命名空间的所有内容都被复制到“DataSets”项目中,其中删除了所有 TableAdapter 代码(连同 xs:annotation)。 p>

DataSets.MyDataSetTableAdapters 命名空间,连同 MyDataSet.xsd 等,被复制并定制到每个“DataSets.SqlClient”、“DataSets.SQLite”等中,每个都引用“数据集”程序集。

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

所以我的问题是:我让这件事变得太难了吗? DataSet 这么标准,需要通过数据访问层支持多个数据库引擎的需求如此普遍,有没有不涉及复制、粘贴和查找替换的方法? 是做什么的?

【问题讨论】:

    标签: c# database strongly-typed-dataset


    【解决方案1】:

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

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

    【讨论】:

    • 我喜欢这个想法,听起来就像 Maurice de Beijer 所描述的那样:theproblemsolver.nl/dbproviderfactory 我回避了这个,因为我不想依赖自己的算法在 SQL 方言之间进行翻译,并且因为搜索和替换 SQL 字符串感觉不对。如果..
    • 如果我能确定我正确地实现了它,这对我来说将是最好的解决方案。
    • SQL 方言之间的翻译由 DbProvider 工厂的 CommandBuilder 处理。它接受选择语句并生成适当的删除和更新命令。
    • 哇!起初我不相信你,我不知道 CommandBuilder 可以做到这一点。参数仍然是个问题,但我觉得我可以处理它...
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2013-08-07
      • 1970-01-01
      • 2015-05-09
      • 2014-06-24
      • 1970-01-01
      • 2011-06-22
      • 2019-11-09
      • 1970-01-01
      相关资源
      最近更新 更多