繁体   English   中英

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

[英]Which ORM should I use together with ServiceStack and an existing database

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

由于ServiceStacks的优秀架构,我决定使用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);
    }
}

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

如果你需要的只是加入(延迟加载或急切加载)和存储过程支持,并希望快速安装,那么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时这将是最简单的。

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

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

您可能会考虑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/

该演示完全自动生成!

另请参阅NHibernate 3.x和Entity Framework 5/6之间的OO视角比较http://www.dennisdoomen.net/2013/03/entity-framework-56-vs-nhibernate-3.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM