1

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

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

4

1 回答 1

1

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

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

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

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

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

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

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

于 2009-08-03T16:25:09.530 回答