【发布时间】: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 为我更新列表的“脏”数据。对我来说,这个过程将涉及以下内容:
- 遍历列表以查找任何“脏”项
- 对于其中的每一个,查看数据库中是否已经存在具有 PK 的项目
- 如果 (2),则更新,否则插入
- 最后,执行
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