2013-10-16 71 views
1

我在之前的幾個項目中使用了EntityFramework,但現在我想嘗試(或切換到)NHibernate!從EF切換到NHibernate(DbContext/UnitOfWork)

但是我有一些麻煩想弄清楚如何用存儲庫模式實現UnitOfWork。

實體框架我做了這樣的事情:

public class MyDbContext : DbContext, IMyDbContext 
{ 
    IDbSet<MyEntity> MyEntities { get; set; } 
    .... 
} 

public class MyRepository : IMyRepository 
{ 
    private readonly IMyDbContext _myDbContext; 

    public MyRepository(IMyDbContext myDbContext) 
    { 
     _myDbContext = myDbContext; 
    } 

    //CRUD-Stuff.... 

    public void SaveChanges() 
    { 
     _myDbContext.SaveChanges(); 
    } 
} 

什麼是與NHibernate相同的最佳做法?

+0

快速搜索'nhibernate unitofwork repository'會將我引向http://stackoverflow.com/q/4271265/1236044,您應該能夠獲得一些提示。 – jbl

回答

3

爲什麼要實施另一個UnitOfWork。 ISession 已經是UOW實現。走這條路只是意味着

  • 很多額外的工作,實現所有很多的陷阱,你可以屬於包裝和倉庫
  • 到像微觀會議
  • 另一種複雜的,因爲確實GetLatePayingCustomersAndTheirOrders()屬於OrdersRepository或CustomerRepository?它很容易只是得到一個會話,並定義2個批處理查詢或一個加入的查詢
  • 預取路徑讓你避免SELECT N + 1但抽象它們很難/很多代碼
  • 緩存沒有上下文/ usecase導致痛苦

也看過ayendes point of viewmy personal experience

2

的的Isession是類似於EF的DbContext和它注入的存儲庫的構造是一個非常好的主意。兩個框架之間最大的區別是持久化模型,NHibernate對象是瞬態的,持久的或者與ISession分離的。瞬態對象使用ISession的Save方法持久化;當會話刷新或提交事務時,持久(即跟蹤)對象的更改會自動保存。

我建議你閱讀並重新閱讀chapter 9 of the documentation瞭解核心概念。