UnitOfWork模式和原子操作

时间:2009-08-03 13:23:55

标签: repository-pattern unit-of-work

我不是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()在写入数据库时​​是否应该分配适当的值?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

如果你想偷看它是托管在谷歌代码上: ws-helpers项目。我需要时间将其作为一个独立的项目,因为它实际上是以前项目的一部分。

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