我正在准备一个新的Windows项目,并想知道使用什么样的DAL技术。最初我在寻找一些更简单的东西,不花太多时间来构建它。但我也理解,从长远来看,它必须是高效和可扩展的。
我计划在3层系统上使用WPF(MVVM)客户端和WCF服务。
总结一下我熟悉的所有现有技术:
数据集
PRO:可能有点老式,但非常容易使用,让大多数部件都可以自动生成。关于数据集的一个有力方面是通过关系遍历相关数据的便利性。此外,它还与数据库断开连接,并可能通过自动处理时间戳来简化更新。包括验证。
CONTRA:相当老式。有些人认为它们不是真正的业务对象/模型,而只是SQL数据表的镜像。在WCF服务/客户端之间传递它们可能比自己创建的业务对象更难。
企业库4.1 - 数据访问阻止
PRO:DAL被精美地置于工厂模式中。它自动处理连接打开和关闭。在大多数情况下非常容易使用。它支持dataSet和普通SQL Sps来创建自己的Business对象。作为正在进行的框架的一部分,与企业库的其余部分结合使用可以更有效地获得高效的最终产品。
CONTRA:??
Linq to SQL
PRO:自动将SQL表创建为业务对象。易于CRUD。从理论上讲,这是一种非常好的方式。
CONTRA:当它出现时已经玩过它,我发现它片状,有时不稳定。在微软宣布实体框架4.0(作为.NET 4.0的一部分)将是微软推荐的方式之后,它已经被认为是一种死技术。在.NET 4.0中只有少数错误修复,但没有更多功能扩展计划。
实体框架4.0
我对此一无所知,但只是因为它最终将取代.NET 4.0上的所有其他内容。我也很想使用它,但是由于它还在BETA中,我还是不能这样做。
我很想使用Enterprise Library 4.1 - 数据访问块并创建自己的业务对象。大骗局是创建DAL需要更多时间。除非有人能说服我通过数据访问块使用DataSet。
您有何评论和想法? 非常感谢, 卡瓦
答案 0 :(得分:3)
您提到实体框架是Linq to SQL选项的“反对”的一部分,但您应该考虑它代替Linq to SQL - 它提供了几乎相同的功能以及更多功能。对于拥有较小数据库的项目来说,它肯定会带来很多好处。在EF中管理大型数据库的上下文可能具有挑战性,并且架构更改可能会导致事情中断,但这些挑战都存在于任何数据访问方法中。
在我看来,EntLib的最大特点是你仍在滚动你自己的数据对象。企业库从直接的“老派”ADO.NET实现中删除了许多管道代码,这很好,但是它不会为您生成可以用于LINQ查询的开箱即用的数据对象。
答案 1 :(得分:2)
我们经常使用带有EntLib 4.1数据应用程序块的DataSet。
我们现在使用Entity Framework。与EntLib 4.1相比,Entity Framework实现了生产力的大幅提升。 (在10小时内将80个表格的数据层改为80,而不是80)
实体框架4仍处于测试阶段,但如果在项目上线前一段时间,我会使用EF 4.您可以获得ORM的生产力同时使用POCO(Plain Old Clr)的灵活性对象)
答案 2 :(得分:1)
一个。还要检查NHibernate。
B中。 DataSet - 最快,最简单,但你编写了很多代码。
所有其他的 - 使用ORM工具有很多好处,但是使用它们进行3次分层存在很多问题。
(延迟加载是一个需要处理的问题,使很多大对象树影响性能,缓存不尽可能聪明)
所以 - 这取决于你的主要需求是什么,以及在开始编码之前你想花多少时间学习EL / LINQ或NHibernate,b / c这个工具有一个学习曲线。
答案 3 :(得分:1)
最好的想法是有机会同时使用这两种技术。 你怎么能这样做?使用Repository模式非常简单。 首先,您需要创建通用的IRepository接口。有点像这样:
public interface IERepository<E>
{
DbTransaction BeginTransaction();
void EndTransaction();
void Add(E entity);
void Delete(E entity);
int Save();
ObjectQuery<E> DoQuery(string entitySetName);
IList<E> SelectAll(string entitySetName);
E SelectByKey(int Key);
bool TrySameValueExist(string fieldName, object fieldValue, string key);
bool TryEntity(ISpecification<E> selectSpec);
int GetCount();
int GetCount(ISpecification<E> selectSpec);
int AddAndSave(E entity);
}
我更喜欢实体框架。我基于它创建了3个项目。它的工作速度非常快,尤其是分页查询。 因此,在您需要使用虚拟方法创建基础泛型类Repository之后,实现IRepository接口。就这样。 现在,您可以非常快速地创建DAl,编写简单的代码,如下所示:
public class MonthRepository:Repository<Month>
{
}
您可以覆盖所有基类方法,并使用您需要的存储过程创建对DB的访问权限。而且你可以在不改变其他地方代码的情况下完成。您仍然会返回相同类型的实体,但会以其他方式获取它们。
更多关注http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx
答案 4 :(得分:1)
NHibernate具有功能集,成熟度和支持的最佳整体组合。
NHibernate, Entity Framework, active records or linq2sql
您应该考虑Linq支持您考虑的任何解决方案的优先级,并且您的前两个选项不支持Linq。