我正在准备一个新的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。

您有何评论和想法? 非常感谢, 卡瓦

有帮助吗?

解决方案

你提到实体框架是“反对”的一部分。对于Linq to SQL选项,但您应该考虑它代替Linq to SQL - 它提供了几乎相同的功能以及更多功能。对于拥有较小数据库的项目来说,它肯定会带来很多好处。在EF中管理大型数据库的上下文可能具有挑战性,而模式更改可能会导致事情中断,但这些挑战都存在于任何数据访问方法中。

在我看来,EntLib的最大特点是你仍在滚动你自己的数据对象。企业库从直接的“老派”中删除了很多管道代码。 ADO.NET实现,这很好,但它不会为您生成可以在LINQ查询中使用的数据对象。

其他提示

我们经常使用带有EntLib 4.1数据应用程序块的DataSet。

我们现在使用Entity Framework。与EntLib 4.1相比,Entity Framework实现了生产力的大幅提升。 (在10小时内将80个表格的数据层改为80,而不是80)

实体框架4仍处于测试阶段,但如果在项目上线前一段时间,我会使用EF 4.您可以获得ORM的生产力同时使用POCO(Plain Old Clr)的灵活性对象)

一个。还要检查NHibernate。

B中。 DataSet - 最快,最简单,但你编写了很多代码。

所有其他的 - 使用ORM工具有很多好处,但是使用它们进行3次分层存在很多问题。

(延迟加载是一个需要处理的问题,使很多大对象树影响性能,缓存不尽可能聪明)

所以 - 这取决于你的主要需求是什么,以及在开始编码之前你想花多少时间学习EL / LINQ或NHibernate,b / c这个工具有一个学习曲线。

最好的想法是有机会同时使用这两种技术。 你怎么能这样做?使用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

NHibernate具有功能集,成熟度和支持的最佳整体组合。

NHibernate,实体框架,活动记录或linq2sql

您应该考虑Linq支持您考虑的任何解决方案的优先级,并且您的前两个选项不支持Linq。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top