代码之家  ›  专栏  ›  技术社区  ›  pdiddy

实体框架+存储库+单元或工作问题

  •  5
  • pdiddy  · 技术社区  · 14 年前

    http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx )

    看看那篇文章,它使用ObjectContext作为工作单元,并将其传递给存储库。

    我的问题是,如果我有2个ObjectContext,这意味着我将有2个工作单元,但我实际上希望在这2个上下文上执行的所有操作都是一个工作单元,这种情况可能吗?我不想对每个上下文都调用save,我希望它是事务性的。。。。不使用transactionscope。。。

    例如,我有一个管理操作日志的上下文和另一个管理订单的上下文。假设在我的业务层中,有一个名为AddOrder()的方法。AddOrder()将使用order上下文来创建新的订单,但它也将使用操作日志上下文来创建新的操作日志条目。因为这是两个上下文,所以我必须在两个上下文上都调用save来提交。。。。也许唯一的选择就是只有一个上下文。。。。

    编辑:我指的是两种不同类型的上下文,例如:OperationalLogContext和OrderContext。

    1 回复  |  直到 14 年前
        1
  •  12
  •   Pure.Krome    14 年前

    是的-我相信这是可能的。

    (请输入密码!)很高兴你问:)

    public interface IOrderRepository
    {
        IQueryable<Order> FindAll();
    }
    
    public interface IOperationLogRepository
    {
        IQueryable<OperationLog> FindAll();
    }
    
    public interface IUnitOfWork
    {
        void Commit();
    }
    

    .

    public class SqlServerContext : ObjectContext, IUnitOfWork
    {
        public void SqlServerContext(string connectionString) 
            : base(connectionString)
        {
        }
    
        public void Commit()
        {
            this.SaveChanges();
        }
    
        // Your other POCO's and stuff here ..etc..
    }
    

    .

    public class OrderRepostiory : IOrderRepository
    {
        private readonly SqlServerContext _sqlServerContext;
        public void OrderRepostiory(SqlServerContext sqlServerContext)
        {
            _sqlServerContext = sqlServerContext;
        }
    
        public IQueryable<Order> FindAll()
        {
            _sqlServerContext.Orders;
        }
    }
    

    public class SqlServerRegistry : Registry
    {
        public SqlServerRegistry(string connectionString)
        {
            For<SqlServerContext>()
                .HybridHttpOrThreadLocalScoped()
                .Use<SqlServerContext>()
                .Ctor<string>("connectionString")
                    .Is(connectionString);
    
            For<IOrderRepository>().Use<OrderRepository>();
            For<IOperationLogRepository>().Use<OperationLogRepository>();
        }
    }
    

    重复使用 在多个存储库中。

    不知道或不理解DI/IoC?

    那么这也可以。。。。

    private SqlServerContext _sqlServerContext;
    private IOrderRepository _orderRepository;
    private IOperationLogRepository _operationLogRepository;
    
    [TestInitialize]
    public void TestInitialise()
    {
        _sqlServerContext = new SqlServerContext(
                 ConfigurationManager.AppSettings["connectionString"]);
        _orderRepository = new OrderRepository(_sqlServerContext);
        _operationLogRepository= new OperationLogRepository(_sqlServerContext);
    }
    
    [TestMethod]
    public void SomeTest()
    {
        // Arrange.
        const int count = 10;
    
        // Act.
        var orders = _orderRepository.FindAll().Take(10).ToArray();
    
        // Assert.
        Assert.IsNotNull(orders);
        CollectionAssert.AllItemsAreNotNull(orders);
        Assert.AreEqual(count, orders.Length);
    }
    

    再一次,这些都是我刚输入的未经测试的代码,因为我正在考虑回答这个问题。

    嗯。