Мы используем Linq to SQL для чтения и записи наших объектов домена в базу данных SQL Server.Восстановление объектов домена из базы данных: проблема с идентификацией
Мы предоставляем ряд услуг (через WCF) для выполнения различных операций. В конце концов, реализация этих операций состоит из трех этапов: восстановление необходимых объектов домена из базы данных; выполнить операцию над объектами домена; сохраняйте (теперь измененные) объекты домена обратно в базу данных.
Проблема в том, что иногда есть два или более экземпляра одного и того же объекта сущности, что может привести к несогласованности при сохранении объектов обратно в db. Немного выдуманный пример:
public void Move(string sourceLocationid, destinationLocationId, itemId);
, который, как предполагается, чтобы переместить элемент с заданным идентификатором от источника к месту назначения (фактические услуги являются более сложными, часто с участием многих мест, предметов и т.д.). Теперь может быть, что оба идентификатора местоположения источника и адресата одинаковы - наивная реализация просто воссоздает два экземпляра объекта сущности, что приведет к проблемам.
Эта проблема теперь «решена», проверяя ее вручную, т. Е. Мы восстанавливаем первое местоположение, проверяем, отличается ли второй идентификатор от него, и если это повторяет второй и т. Д. Это непротиворечиво и подвержено ошибкам.
В любом случае, я был на самом деле удивлен тем, что, как представляется, не существует «стандартного» решения для этого в управляемом доменом дизайне. В частности, репозитории или фабрики, похоже, не решают эту проблему (если они не поддерживают свой собственный кеш, который затем необходимо обновить и т. Д.).
Моей идеей было бы сделать объект DomainContext за операцию, которая отслеживает и кэширует объекты домена, используемые в этом конкретном методе. Вместо того, чтобы восстанавливать и сохранять отдельные объекты домена, такой объект будет восстановлен и сохранен в целом (возможно, с использованием репозиториев), и он может действовать как кеш для объектов домена, используемых в этой конкретной операции.
В любом случае, похоже, что это распространенная проблема, так как это обычно происходит? Что вы думаете об этой идее?