gpt4 book ai didi

.net - Entity Framework + 存储库 + 单元或工作问题

转载 作者:行者123 更新时间:2023-12-04 17:05:08 25 4
gpt4 key购买 nike

我正在考虑使用 EF 4 开始一个新项目并浏览了一些文章,我发现了一篇关于 EF 的文章以及存储库模式和工作单元 (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 并将其传递给存储库。

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

例如,我有一个管理操作日志的上下文和另一个管理订单的上下文。假设在我的业务层中,我有一个名为 AddOrder() 的方法。 AddOrder() 将使用订单上下文来创建新订单,但它也会使用操作日志上下文来创建新的操作日志条目。由于这些是 2 个上下文,我将不得不在两个上下文上调用 save 来提交 .... 也许唯一的选择是只有一个上下文 ....

编辑:我的意思是 2 个不同类型的上下文,例如:OperationalLogContext 和 OrderContext。

最佳答案

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

关键是如何处理您的存储库。

例如,每个 Repository 应该接受一个 Context .. 所以只需创建一个上下文并将其传递给每个存储库。

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

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;
}
}

.. 最后,实例化。因为你是一个好男孩/女孩/彩虹 unicorn ,你会使用依赖注入(inject)..
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,它将被实例化一次并在多个Repositories 中重用。

不知道或不了解 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。

关于.net - Entity Framework + 存储库 + 单元或工作问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com