2009-08-03 3 views
1

Я не уверен на 100%, что я правильно использовал свои шаблоны репозитория и UnitOfWork, но тогда я не вижу, как это будет работать.Модели UnitOfWork и атомные операции

Например, у меня есть два объекта: Apple и Orange.

Apple, присоединяется к Orange через OrangeID так:

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

Я хочу, чтобы создать новый Apple, и новый оранжевый, и я хочу, чтобы установить связь ID соответствующим образом. Но у меня проблема. Я не буду знать OrangeID, пока не сохраню Orange в базе данных.

Таким образом, это означает, что у меня будет следующее:

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

Во-первых, я не могу видеть это как отношение между субъектами яблоко и апельсин. Это просто Apple имеет числовой атрибут OrangeID. Ваш код должен быть таким:

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

Тогда вы можете проверить, правильно ли установлено отношение db. Итак, теперь нет доказательств Если ваша работа по выполнению единицы работы работает или нет.

Кроме того, Есть много доступных реализаций, если вы хотите сохранить часть своего времени.

Хотя, я уже заново изобрел колесо, и я использую реализацию моих :)

Если вы хотите, чтобы взглянуть Он размещен на Google Code: ws-helpers проект. Мне нужно время, чтобы сделать это как автономный проект, потому что он был фактически частью предыдущего проекта.

Несомненно, самая известная реализация - Rhino-Tools/UnitOfWork. Но я предпочитаю мой, потому что я могу создать столько единиц, сколько мне нужно, каждый с отдельной транзакцией, в то время как в Rhino-Tools всегда есть только одно текущее устройство. Но я еще не уверен в потокобезопасности текущей реализации.

Смежные вопросы