Глубокая копия сущности с помощью NHibernate - PullRequest
3 голосов
/ 20 февраля 2010

В настоящее время я работаю над новым проектом ASP.NET MVC, в котором нам нужно сгенерировать оценку стоимости проекта.

Мы используем NHibernate, ASP.NET MVC 1.0 и StructureMap.

Клиент хочет, чтобы была возможность заполнить всю информацию о проекте, информация находится на разных страницах, и мы должны сохраняться между каждым постом обратно.

Клиент не хочет иметь возможность сохранить его под именем, когда оно будет завершено, но мы хотим сохранить его в базе данных, даже если он еще не сохранил его. Итак, у нас появилась идея создать «Режим черновика», чтобы пользователь начал работать над своим проектом, заполнил все страницы и он был сохранен в базе данных с включенным «Черновым режимом».

Но нам нужно управлять черновиками, я имею в виду, когда пользователь начнет редактировать существующий проект, нам нужно будет создать его копию, перевести объект и все его дочерние элементы в режим черновиков и создать его копию в нашей базе данных. Нам нужно будет изменить все ссылки от детей.

Итак, я пытаюсь найти лучший способ глубокого копирования объектов и изменения всех ссылок, Я бы предпочел не создавать класс копирования для каждой сущности, которую мне придется копировать, возможно, что-то более общее, если это возможно.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или если что-то неясно.

Спасибо

Charles

Ответы [ 4 ]

8 голосов
/ 21 февраля 2010

Я бы попытался, чтобы мой домен решил эту проблему, и оставил NHibernate просто сохранять данные, а не копировать их.Я хотел бы создать интерфейс IDeepCopy, который определяет метод DeepCopy ().И затем в каждом из этих методов вы создадите новый объект и просто скопируете значения самостоятельно и управляете тем, как вы хотите правильно обрабатывать дочерние или родительские объекты.

1 голос
/ 29 июня 2011

Я использую эту функцию:

    public static T DeepClone<T>(T obj)
    {
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;

            return (T)formatter.Deserialize(ms);
        }
    }
1 голос
/ 20 февраля 2010

Я рекомендую использовать SharpArchitecture для вашего проекта. Это сэкономит вам много времени и денег.
Нет простого способа сделать глубокую копию данных, потому что это очень специфично для конкретного случая. Таким образом, вы должны создать все копии вручную.
Я также рекомендую использовать разные таблицы для черновиков, а не черновиков. ИМО в этом случае будет намного проще в реализации и не нарушает SRP . Как было сказано, разделяй и властвуй.

1 голос
/ 20 февраля 2010

Это, вероятно, плохая идея, и я не уверен, что это сработает, но что, если вы просто пройдете по графу объектов и установите для всех необходимых идентификаторов несохраненные значения по умолчанию, а затем разрешите каскадным сохранениям выполнить работу по расстановке всехссылки обратно вместе в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...