我目前正在开发一个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);
}
}
上面的示例显示了一个简单的业务对象。大多数其他人需要使用许多过滤器插入,更新,删除,多个连接和读取。
答案 0 :(得分:6)
如果你需要的只是加入(延迟加载或急切加载)和存储过程支持,并希望快速安装,那么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或小巧玲珑。这两个只是具有较少功能的瘦包装器,但它们将为您提供最佳性能和最大灵活性 - 即使这意味着每隔一段时间写一些SQL。
您也可以使用混合方法。不要害怕混搭。使用POCO时这将是最简单的。
我认为重要的是代码以满足您当前的数据库和当前需求。但是,要使用适当的接口这样做,所以如果有时间切换到不同的数据库或存储机制,那么您只需创建一个新的数据提供程序并将其插入。
答案 1 :(得分:3)
Ormlite支持使用表达式的原始Join函数。新的JoinSqlBuilder类可以帮助解决这个问题。对于SP,我添加了new T4 file来生成相应的c#函数。目前SP生成代码仅支持Sql Server;如果您正在使用任何其他数据库,则可以轻松添加对它的支持。
答案 2 :(得分: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/
该演示完全自动生成!
答案 3 :(得分:1)
还要从NHibernate 3.x和Entity Framework 5/6之间的OO角度检查这种比较 http://www.dennisdoomen.net/2013/03/entity-framework-56-vs-nhibernate-3.html