我不是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()在写入数据库时是否应该分配适当的值?
任何帮助/提示将不胜感激, 谢谢 邓肯
答案 0 :(得分:1)
首先,我不认为这是Apple和Orange实体之间的关系。 这只是一个Apple有一个名为OrangeID的数字属性。您的代码应该是:
Apple apple = new Apple(newOrange);
AppleRepository.Insert(apple);
unitOfWork.Commit();
然后,您可以检查是否已正确建立数据库关系。 所以现在没有证据如果您的工作单元实施有效。
此外,有许多可用的实现,如果你想节省一些时间。
虽然,我已经重新发明了轮子并使用了我的实现:)
如果你想偷看它是托管在谷歌代码上: ws-helpers项目。我需要时间将其作为一个独立的项目,因为它实际上是以前项目的一部分。
当然,最着名的实现是Rhino-Tools / UnitOfWork。 但是,我更喜欢我的,因为我可以根据需要创建尽可能多的单元,每个单元都有一个单独的事务,而在Rhino-Tools中总是只有一个当前单元。但我还不确定当前实现的线程安全性。