Сохранение сложных данных тестирования

SELECT cols
FROM table
WHERE cols IS NULL
7
задан Glorfindel 26 April 2019 в 01:50
поделиться

6 ответов

Вам нужно лучше определить ваши каскады в домене. Если вы не можете проверить это, как вы ожидаете, что он будет работать в реальном приложении?

Например:

A -> B: Кто является владельцем этого отношения? Вы хотите добавить B к A или наоборот? Это может быть деталь реализации, где у вас могут быть как B.SetParent (A), так и A.Children.Add (B), и где вы устанавливаете родительский элемент B на A в случае A.Children.Add (B) (аналогично другой наоборот). Что произойдет, если вы сделаете:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.Children.Add(b);
b.SetParent(a);

Здесь вам нужно принять решение. Ни одно из решений не является идеальным, так что ' Это в основном личные предпочтения и согласованность приложений, которые применяются здесь.

Работая с ORM, вы сталкиваетесь с этими проблемами ограничений быстрее, чем с простым SQL (или любым другим источником данных, таким как XML или ваш собственный источник данных), но вам необходимо учитывать проблемы если бы вы тоже написали простой SQL.

Извините, у меня нет для вас однозначного ответа, но мне кажется, что вам нужно учитывать некоторые ограничения, которые (я полагаю) вы не сделали пока.

Лично мне нравится шаблон репозитория при использовании NHibernate в DAL. Я делаю свои репозитории реализацией из IDisposable и позволяю каждому получить сеанс. Таким образом, вы добавите шаблон «Единица работы» в свой дизайн.

Удачи вам :)

Работая с ORM, вы быстрее попадете в эти проблемы с ограничениями, чем с простым SQL (или любым другим источником данных, таким как XML или ваш собственный источник данных), но вам нужно будет учитывать проблемы, если вы пишете и простой SQL.

Извините, у меня нет для вас однозначного ответа, но мне кажется, что вам нужно учесть некоторые ограничения, которые (я полагаю) вы еще не сделали.

Лично мне нравится репозиторий -шаблон при работе с NHibernate в DAL. Я реализую свои репозитории из IDisposable и позволяю каждому получить сеанс. Таким образом, вы добавите шаблон «Единица работы» в свой дизайн.

Удачи вам :)

Работая с ORM, вы быстрее попадете в эти проблемы с ограничениями, чем с простым SQL (или любым другим источником данных, например XML или вашим собственным источником данных), но вам нужно будет рассмотреть проблемы, если вы напишете и простой SQL.

Извините, у меня нет для вас однозначного ответа, но мне кажется, что вам нужно учитывать некоторые ограничения, которые (я полагаю) вы еще не сделали.

Лично мне нравится репозиторий -шаблон при работе с NHibernate в DAL. Я реализую свои репозитории из IDisposable и позволяю каждому получить сеанс. Таким образом, вы добавите шаблон «Единица работы» в свой дизайн.

Удачи вам :)

У меня есть для вас определенный ответ, но мне кажется, что вам нужно учитывать некоторые ограничения, которые (я полагаю) вы еще не сделали.

Лично мне нравится шаблон репозитория при использовании NHibernate в DAL. Я делаю свои репозитории реализацией из IDisposable и позволяю каждому получить сеанс. Таким образом, вы добавите шаблон «Единица работы» в свой дизайн.

Удачи вам :)

У меня есть для вас определенный ответ, но мне кажется, что вам нужно учитывать некоторые ограничения, которые (я полагаю) вы еще не сделали.

Лично мне нравится шаблон репозитория при использовании NHibernate в DAL. Я делаю свои репозитории реализацией из IDisposable и позволяю каждому получить сеанс. Таким образом, вы добавите шаблон «Единица работы» в свой дизайн.

Удачи вам :)

1
ответ дан 7 December 2019 в 10:05
поделиться

Для WPF нет NotifyIcon.

Мой коллега успешно использовал эту свободно доступную библиотеку:

0
ответ дан 7 December 2019 в 10:05
поделиться

You should probably describe your test setup in more detail. In particular, why do your functional tests require these objects to be persisted? Are you testing the actual persistence operation? Or is that just a side effect of running the tests? Do you want to load persisted objects as part of your tests?

My problem is, if I want to persist a C, should it persist it's B? Or should it be persisted before hand?

This will depend on why you are persisting in the first place. If you are integration testing the persistence layer, then you should just use the logic the application itself uses. If it's just a side effect of testing, you might want to mock the persistence layer, etc...

3
ответ дан 7 December 2019 в 10:05
поделиться

Я разделил ваши ответы по темам.

Моя проблема в том, что если я хочу сохранить C , должен ли он сохраняться, это B ? А что, если я хочу сохранить D? Должны ли сохраняться все A, B, C?

Это полностью зависит от ограничений домена, которые вы выбираете для обеспечения соблюдения. Например, является ли C объектом, а B - объектом значения? Другими словами, имеет ли C уникальную индивидуальность и собственную жизнь? Определяется ли B в основном по его ценности, и его жизненный цикл тесно связан с жизненным циклом его родительского C ?

Задавая эти типы вопросов, вы должны помочь вам принять решение о том, что сохранить, когда и кем.

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

Или его следует сохранить заранее?

Чтобы ответить на этот вопрос, вам, возможно, придется отобразить зависимости ваших объектов. Эти зависимости часто представлены ограничениями внешнего ключа, когда граф объектов сохраняется в СУБД. Если C не может работать без ссылки на B , то вы, вероятно, захотите сохранить их оба внутри транзакции, при этом сначала выполняется B , чтобы соответствовать ограничениям внешнего ключа базы данных. Следуя рассуждению выше, если B был дочерней сущностью или объектом значения для C , вы могли бы даже иметь C , ответственный за сохранение B .

Что делать, если мне нужен разумный B по умолчанию?

Создание экземпляров B может быть делегировано B -Factory. Независимо от того, реализуете ли вы эту фабричную логику как метод класса (а не экземпляр), конструктор или отделяете ее как отдельную единицу, не имеет значения. Дело в том, что у вас есть одно место, где происходит создание и настройка новых B . Именно в этом месте у вас будет иметь место конфигурация по умолчанию для вновь созданного объекта.

1
ответ дан 7 December 2019 в 10:05
поделиться

Я не уверен, что правильно понял проблему, которую вы пытаетесь решить, но ... как насчет сериализации всего графа в виде XML, используя что-то вроде XStream или Google Буферы протокола ?

1
ответ дан 7 December 2019 в 10:05
поделиться

Насколько я понимаю это проблема с вашим доменом (как вы его нарисовали). Насколько я понимаю, C имеет отношение «многие к одному» с B, и база данных закрепляет его с помощью поля внешнего ключа, не допускающего значения NULL. С другой стороны, из кода в вопросе я мог понять, что в коде не применяется строго одно правило, и член, который ссылается на экземпляр B в экземпляре C, может быть нулевым. Насколько я понимаю, модель предметной области всегда должна быть правильной в коде и во время выполнения, поэтому, если бы это правило было реализовано в коде (например, путем запроса ссылки B в методе C build ()), у вас не было бы проблем с постоянством - вы могли бы просто сохранить все.

Другим, гораздо более грязным решением было бы просто программно сбросить все ограничения БД, которые мешают вашим тестам перед тестом, и восстановить их после. Конечно, это сделало бы БД полностью непригодным для использования для чего-либо еще, работающего параллельно с тестом, но это можно решить, используя интегрированную БД, такую ​​как SQLite или SQL Server Compact Edition, только для тестов.

гораздо более грязным решением было бы просто программно сбросить все ограничения БД, которые мешают вашим тестам перед тестом, и восстановить их после. Конечно, это сделало бы БД полностью непригодным для использования для чего-либо еще, работающего параллельно с тестом, но это можно решить, используя интегрированную БД, такую ​​как SQLite или SQL Server Compact Edition, только для тестов.

гораздо более грязным решением было бы просто программно сбросить все ограничения БД, которые мешают вашим тестам перед тестом, и восстановить их после. Конечно, это сделало бы БД полностью непригодным для использования для чего-либо еще, работающего параллельно с тестом, но это можно решить, используя интегрированную БД, такую ​​как SQLite или SQL Server Compact Edition, только для тестов.

0
ответ дан 7 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: