2012-10-10 24 views
0

我可能会离开这里,这个问题可能与主观接近,但是无论如何这里有。列表到数据库

目前我用IList<T>从内存中的数据库中缓存信息,所以我可以使用LINQ来查询他们的信息。我有一个ORM'ish层,我已经在SO的一些问题的帮助下编写,以便从数据库中轻松查询我需要的信息。例如:

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

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

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

再次运行得非常好。

现在在我的应用程序的GUI层,特别是当绑定DataGridView的用户编辑数据时,我发现自己绕过这个DAL层,并直接使用TableAdapters内的形式打破分层架构的气味有点给我。我还发现,我在这里使用的是TableAdaptersILists,在我的代码中存在不同的标准,我希望将它们合并为一个。

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

  1. 遍历列表中的任何“脏”项目
  2. 对于这些,看看是否存在与在DB
  3. 如果PK的项目(2),然后更新,否则插入
  4. 最后,执行Delete FROM * WHERE ID NOT IN('all ids in list')查询

我不能完全肯定这是如何在TableAdapter处理,但我可以看到这个方法的性能下降显随着清单上的项目越来越多,这种情况非常迅速而且很快。

所以我的问题是这样的:

是否存在的承诺清单数据库更简单的方法?请注意单词commit,因为它可能是插入/更新或删除。

我是否应该转换为DataTable?例如here

我确定一些更高级的ORM会执行这种类型的事情,但是有没有可以为我做这个的迷你ORM(例如dapper/Petapoco/Simple.data等)?我想保持简单(就像我现在的DAL一样)和灵活的(如果它能完全满足我的需求,我不介意编写SQL)。

+0

有没有令人信服的理由,您没有使用功能丰富的ORM?你在做什么听起来很不方便。 –

+0

是的,我开始认为这可能是最好的 – Simon

+1

从零开始构建自定义的ORM非常诱人并且容易陷入。您现在处于转折点,最好停止开发您的自定义ORM,并且如果可以,请使用真正的ORM。现代ORM已经很好地解决了许多复杂的问题,重新发明轮子不可能符合客户的最佳利益。 –

回答

1

目前我使用IList从内存中的数据库缓存信息,所以我可以使用LINQ来查询他们的信息。

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

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

  • 一个完整的ORM像实体框架
  • 使用数据集与DataDapters
  • 使用基本ADO.NET(DataReader的和List <>)和实现自己的变化跟踪。

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

+0

感谢Henk,我没有意识到我可以绕过整个缓存列表。所以我想我可以使用DataSets来存储缓存的信息,但是当我需要的时候,仍然会映射到POCO的retreive信息。 – Simon

+0

也许对数据集的第二个想法...... ORM最好在这里 – Simon