我正在考虑开始一个使用EF 4的新项目,并阅读了一些文章,我找到了一篇关于EF with repository pattern and unit of work (http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx)的文章。
看看那篇文章,它使用ObjectContext作为UnitOfWork,并将其传递给存储库。
我的问题是,如果我有两个ObjectContext,这意味着我将有两个工作单元,但我实际上希望在这两个上下文上执行的所有操作都是一个工作单元,这种情况可能吗?我不想在每个上下文上调用save,我希望它是事务性的……如果不使用事务作用域...
例如,我有一个管理操作日志的上下文和另一个管理订单的上下文。假设在我的业务层中,我有一个名为AddOrder()的方法。AddOrder()将使用订单上下文来创建新订单,但它还将使用操作日志上下文来创建新的操作日志条目。因为这是两个上下文,所以我必须在两个上下文上调用save才能提交...也许唯一的选择就是只有一个上下文……
编辑:我指的是两种不同类型的上下文,例如: OperationalLogContext和OrderContext。
发布于 2010-09-15 11:07:22
是的,我相信这是可能的。
关键是如何处理您的存储库。
例如,每个存储库都应该有一个上下文。因此,只需创建一个上下文并将其传递给每个存储库。
(请输入代码!)很高兴你问:)
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>();
}
}因为SqlServerContext被定义为HttpOrThreadLocal,所以它将被实例化一次,并在多个存储库中重用。
不知道或不了解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);
}再一次,这是我刚刚输入的所有未经测试的代码,因为我正在考虑回答这个问题。
HTH。
https://stackoverflow.com/questions/3714317
复制相似问题