【问题标题】:UnitOfWork pattern and atomic operationsUnitOfWork 模式和原子操作
【发布时间】:2010-03-09 06:01:11
【问题描述】:

我不能 100% 确定我是否正确实现了我的 Repository 和 UnitOfWork 模式,但是我看不出这还能如何工作。

例如,我有两个对象,Apple 和 Orange。

Apple 通过 OrangeID 加入到 Orange,如下所示:

public class Apple
{
  public int OrangeID { get; set; }
}

我想创建一个新的 Apple 和一个新的 Orange,并且我想适当地设置 ID 链接。但我有一个问题。在将 Orange 保存到数据库之前,我不会知道 OrangeID。

所以这意味着我将拥有以下内容:

var unitOfWork = new UnitOfWork();
Orange newOrange = new Orange();
OrangeRepository.Insert(newOrange);
unitOfWork.Commit();

//newOrange will have been updated with the actual ID
Apple newApple = new Apple(newOrange.ID);
etc...

这不是原子操作,除非我有一个位于上述之外的事务。但我认为这是 UnitOfWork 应该处理的?或者我的 UnitOfWork.Commit() 应该在写入数据库时​​分配适当的值吗?

任何帮助/提示将不胜感激, 谢谢 邓肯

【问题讨论】:

    标签: repository-pattern unit-of-work


    【解决方案1】:

    首先,我不认为这是 Apple 和 Orange 实体之间的关系。 它只是一个 Apple 有一个名为 OrangeID 的数字属性。你的代码应该是这样的:

    Apple apple = new Apple(newOrange);
    AppleRepository.Insert(apple);
    unitOfWork.Commit();
    

    然后,您可以检查 db 关系是否已正确建立。 所以现在没有证据证明你的工作单元实现是否有效。

    此外,还有很多可用的实现,如果您想节省一些时间。

    虽然,我已经重新发明了轮子,并使用了我的实现:)

    如果您想看看它托管在 google 代码上: ws-helpers 项目。我需要时间把它做成一个独立的项目,因为它实际上是以前项目的一部分。

    当然,最著名的实现是 Rhino-Tools/UnitOfWork。 但是,我更喜欢我的,因为我可以根据需要创建任意数量的单元,每个单元都有一个单独的事务,而在 Rhino-Tools 中总是只有一个当前单元。但我还不确定当前实现的线程安全性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多