4

我目前正在开发一个 Web 服务,它提供对业务对象的基本 CRUD 操作。该服务将由当前使用直接数据库访问的遗留应用程序使用。

由于 ServiceStack 的架构很棒,我决定使用 ServiceStack 而不是 WCF。

但是知道我正在尝试决定是否使用 OrmLite、nHibernate 或 Entity Framework 来访问现有的遗留数据库。

ORM 的要求如下

  • 支持连接
  • 支持存储过程

我已经尝试过 OrmLite(因为它很快并且已经包含在 ServiceStack 中)。我设法加入两个表的唯一方法是使用 SQL(不是一个选项)。有没有更好的办法?

// @stackoverflow: This is my POCO DTO
public class Country
{
    public long Id { get; set; }

    public string Alpha2 { get; set; }

    public string Alpha3 { get; set; }

    public string ShortText { get; set; }

    public string LongText { get; set; }
}

public class CountryRepository : ICountryRepository
{
    // @stackoverflow: This is the query to join countries with translated names stored in another table 
    private const string CountriesSql =
        @"SELECT C.Id, C.Alpha2, C.Alpha3, L.ShortText, L.LongText FROM COUNTRY AS C INNER JOIN LOCALIZATION AS L ON C.LocId = L.Id WHERE (L.Lang_Id = {0})";

    private const string CountrySql = CountriesSql + " AND C.Id={2}";

    private IDbConnection db;
    public IDbConnectionFactory DbFactory { get; set; }

    private IDbConnection Db
    {
        get { return db ?? (db = DbFactory.Open()); }
    }

    public List<Country> GetAll()
    {
        return Db.Select<Country>(CountriesSql, 0);
    }

    public Country GetById(long id)
    {
        return Db.SingleOrDefault<Country>(CountrySql, 0, id);
    }
}

上面的示例显示了一个简单的业务对象。大多数其他人需要使用许多过滤器进行插入、更新、删除、多个连接和读取。

4

4 回答 4

7

如果您只需要连接(延迟加载或急切加载)和存储过程支持并且想要快速设置,那么 Entity Framework 和 nHibernate 是不错的选择。这是一个关于 EntityFramework 以及存储库和工作单元模式的很酷的链接。http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx

如果您非常关心性能并希望更好地控制类的外观(即POCO)和行为,那么您可以尝试更轻量级的东西,例如 ORMLite 或 Dapper。这两个只是功能较少的瘦包装器,但它们将为您提供最佳性能和最大灵活性——即使这意味着每隔一段时间编写一些 SQL。

您还可以使用混合方法。不要害怕混搭。使用 POCO 时,这将是最简单的。

我认为重要的是为您当前的数据库和当前需求编写代码。但是,要使用适当的接口来做到这一点,所以如果需要切换到不同的数据库或存储机制,那么您只需创建一个新的数据提供程序并将其插入即可。

于 2013-02-13T23:47:39.153 回答
3

Ormlite 支持使用表达式的原始连接函数。新的JoinSqlBuilder类可以帮助解决这个问题。对于 SP,我添加了一个新的 T4 文件来生成相应的 c# 函数。目前SP生成代码只支持Sql Server;如果您使用任何其他数据库,您可以轻松添加对它的支持。

于 2013-02-14T02:20:54.093 回答
2

您可能会考虑 LLBLGen Pro——它对数据库优先设计有很好的支持,并且如果您使用 nHibernate 或 EF,它还具有加速入门的设计器工具。但它是$$。 http://llblgen.com

作为对此的跟进,Matt Cowan 创建了一个 AWESOME 模板生成器,用于使用 LLBLGen 构建此类东西。在此处查看博客文章:

http://www.mattjcowan.com/funcoding/2013/03/10/rest-api-with-llblgen-and-servicestack/

并在这里演示:

http://northwind.mattjcowan.com/

该演示完全是自动生成的!

于 2013-03-07T09:06:32.383 回答
1

还可以从 NHibernate 3.x 和 Entity Framework 5/6 http://www.dennisdoomen.net/2013/03/entity-framework-56-vs-nhibernate-3.html的 OO 角度检查此比较

于 2013-03-13T20:47:02.423 回答