我应该使用哪个ORM与ServiceStack和现有数据库一起使用?

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);
    }
}

上面的例子展示了一个简单的业务对象。大多数其他对象需要插入、更新、删除、多个连接和带有许多过滤器的读取操作。

我想知道为什么SQL连接不是一个选项? - adt
因为我不想依赖于底层数据库。一些未来的情景包括存储到不同的RDBMS。此外,一旦我开始CRUD大型对象,我担心会有太多手动SQL。 - Markus
1
支持连接和存储过程。NHibernate和EF都可以胜任。NHibernate拥有更多的功能,但是EF的Linq支持更好,并且相对容易学习(在我看来)。由于您有许多过滤器,也许您打算使用的方式应该是决定因素。 - Gert Arnold
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 如果你非常关注性能,并且希望更多地控制你的类将会如何(例如POCOs)以及行为,那么你可以尝试使用一些更轻量级的东西,如ORMLite或Dapper。这两个都只是较少功能的薄包装器,但它们将给你最好的性能和最大的灵活性,即使这意味着偶尔要编写一些SQL。
你也可以使用混合方法。不要害怕混搭。当使用POCOs时,这将是最容易的。
我认为重要的事情是根据你当前的数据库和当前的需求进行编码。然而,要使用正确的接口这样,如果将来要切换到其他数据库或存储机制,则只需创建一个新的数据提供程序并插入即可。

1
我使用了一个复杂实体进行了一些测试。EF5 比 OrmLite 稍微慢一些,但考虑到我们非常复杂的遗留数据库,我更倾向于快速设置而不是性能。感谢您的回答! - Markus

3

Ormlite支持使用表达式进行基本的Join函数。新的JoinSqlBuilder类可以帮助实现这一点。对于存储过程,我添加了一个新的T4文件来生成相应的C#函数。目前,SP生成代码仅支持Sql Server;如果您使用其他数据库,可以轻松添加支持。


2
您可以考虑使用LLBLGen Pro -- 它对数据库优先设计提供了很好的支持,如果您使用nHibernate或EF,它还具有设计工具,可以加快入门速度。但是它需要花费一定的费用。 http://llblgen.com 作为对此的跟进,Matt Cowan创建了一个令人惊叹的模板生成器,可用于使用LLBLGen构建此类应用程序。请在此处查看博客文章:

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

在此处演示:

http://northwind.mattjcowan.com/

这个演示完全是自动生成的!

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接