簡體   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