从EF切换到NHibernate(DbContext / UnitOfWork)

时间:2013-10-16 20:19:45

标签: nhibernate repository-pattern dbcontext unit-of-work

我之前在一些项目中使用过EntityFramework,但现在我想尝试(或切换到)NHibernate!

但是我有一些麻烦要弄清楚如何使用存储库模式实现UnitOfWork。

使用Entity Framework我做了类似的事情:

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相同的最佳做法是什么?

2 个答案:

答案 0 :(得分:3)

为什么要实施另一个UnitOfWork。 ISession 已经是一个UOW实现。走这条路只意味着

  • 实现所有包装器和存储库的大量额外工作
  • 你可以陷入许多陷阱,如微观管理会议
  • 另一种复杂性,因为GetLatePayingCustomersAndTheirOrders()属于OrdersRepository还是CustomerRepository?只需获取会话并定义2个批处理查询或一个已加入查询
  • 即可
  • 预取路径可以让你避免使用SELECT N + 1但是抽象它们很难/很多代码
  • 没有上下文/用例的缓存会导致痛苦

还阅读了ayendes point of viewmy personal experience

答案 1 :(得分:2)

ISession类似于EF DbContext,并将其注入存储库构造函数是一个非常好的主意。两个框架之间最大的区别是持久性模型,NHibernate对象是瞬态的,持久的或与ISession分离的。使用ISession的Save方法使瞬态对象持久化;持久(即跟踪)对象在刷新会话或提交事务时会自动保存其更改。

我建议您阅读并重新阅读chapter 9 of the documentation以了解核心概念。