2013-10-16 32 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了解核心概念。