【问题标题】:List to Database列表到数据库
【发布时间】:2012-10-01 00:16:09
【问题描述】:

我可能离这里很远,这个问题可能与主观问题接壤,但无论如何都在这里。

目前我使用IList<T> 将数据库中的信息缓存在内存中,因此我可以使用LINQ 从中查询信息。我在 SO 上的一些问题的帮助下编写了一个 ORM'ish 层,以便轻松地从数据库中查询我需要的信息。例如:

IList<Customer> customers = DB.GetDataTable("Select * FROM Customers").ToList<Customer>();

它工作正常。我还有扩展方法来对这些列表中的单个项目进行 CRUD 更新:

DB.Update<Customer>(customers(0));

再次运行良好。

现在在我的应用程序的 GUI 层中,特别是在绑定 DataGridView 以供用户编辑数据时,我发现自己绕过了这个 DAL 层并直接在表单中使用 TableAdapters,这会破坏分层对我来说有点味道的建筑。我还发现我在这里使用TableAdapters 和那里使用ILists,在我的代码中遵循不同的标准,我想将它们合并为一个。

理想情况下,我希望能够绑定到这些列表,然后让 DAL 为我更新列表的“脏”数据。对我来说,这个过程将涉及以下内容:

  1. 遍历列表以查找任何“脏”项
  2. 对于其中的每一个,查看数据库中是否已经存在具有 PK 的项目
  3. 如果 (2),则更新,否则插入
  4. 最后,执行Delete FROM * WHERE ID NOT IN('all ids in list') 查询

我不完全确定 TableAdapter 是如何处理这个问题的,但我可以看到随着列表中项目的增加,这种方法的性能显着下降并且很快。

所以我的问题是这样的:

有没有更简单的提交列表到数据库的方法?请注意提交一词,因为它可能是插入/更新或删除。

我应该转换为DataTable 吗?例如here

我确信一些更高级的 ORM 会执行此类操作,但是是否有任何小型 orm(例如 dapper/Petapoco/Simple.data 等)可以为我执行此操作?我想让它保持简单(就像我目前的 DAL 一样)和灵活(如果它完全满足我的需要,我不介意编写 SQL)。

【问题讨论】:

  • 您没有使用功能丰富的 ORM 是否有令人信服的理由?你正在做的事情听起来很不寻常。
  • 是的,我开始认为这可能是最好的
  • 从头开始构建自定义 ORM 很诱人,也很容易陷入其中。您现在正处于转折点,最好停止开发您的自定义 ORM,如果可以的话,使用真正的 ORM。现代 ORM 已经很好地解决了许多复杂的问题,重新发明轮子不太可能符合客户的最大利益。

标签: c# database orm data-access-layer


【解决方案1】:

目前我使用 IList 将数据库中的信息缓存在内存中,这样我就可以使用 LINQ 从它们中查询信息。

Linq 还有一个名为 Linq-to-Datasets 的部门,所以这不是一个令人信服的理由。

更好地决定你真正想要/需要什么:

  • 类似实体框架的完整 ORM
  • 将数据集与 DataDapters 一起使用
  • 使用基本的 ADO.NET(DataReader 和 List)并实现您自己的更改跟踪。

您可以在一定程度上混合使用它们,但正如您所说,最好选择一个。

【讨论】:

  • 感谢 Henk,我没有意识到我可以绕过整个缓存列表。所以我想我可以使用 DataSets 来存储缓存的信息,但仍然映射到 POCO 以在需要时检索信息。
  • 也许对数据集的第二个想法......可能这里最好使用 ORM
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2019-05-06
相关资源
最近更新 更多