Я искал ответ в Google, используя:
"Тип" Microsoft.SqlServer.Management.Smo.Server "определен в сборке, на которую нет ссылок."
Почему для использования Microsoft Sql Server Management Objects (SMO) в DAL требуются ссылки на библиотеки SMO в ссылочном проекте?
с использованием sql smo в ссылочных проектах
sqlsmo в многоуровневых решениях
sql ссылочные требования smo
и, возможно, несколько других, которые не нашли решения или объяснения этой проблемы.
Правда, я всего лишьподмастерье, гуглер, так что если кто-то захочет повысить уровень меня и указать путь к существующему ресурсу, я с радостью пойду отсюда.
Вот мои настройки:
У меня есть многоуровневое решение: DAL, Business Logic, Services, UI.Есть хост-проект, в котором размещаются сервисы.Я на самом деле использую расширение VS2010 layerguidance.codeplex.com , что довольно неплохо, для настройки всех этих проектов.Я использую SQL Server 2008 Express и SMO v 10. Все проекты решений упоминаются с использованием ссылок проекта.Все проекты компилируются в общую папку Bin верхнего уровня.
Теперь проблема:
Среди классов в DAL у меня есть класс SmoTasks
, который обрабатывает взаимодействие сОбъекты SMO и класс Utilities
, который абстрагируется от SmoTasks
и предоставляет доступ к его функциям, не требуя каких-либо объектов SMO для параметров, так что ссылки на проекты (читай: Уровень бизнес-логики) могут взаимодействовать с использованием не-SMO типов.В DAL все хорошо, он прекрасно компилируется, методы проходят свои тесты - он хорошо себя чувствует в своем мире.Затем в BLL у меня есть компонент, который обрабатывает, используя класс Utilities
, чтобы выполнить настройку базы данных для приложения, которое будет представлено через сервисы.BLL использует ссылку на проект на DAL и видит классы DAL (в целом), как и ожидалось.Когда я компилирую, я получаю:
Тип 'Microsoft.SqlServer.Management.Smo.Server' определяется в сборке, на которую нет ссылок.Необходимо добавить ссылку на сборку 'Microsoft.SqlServer.Smo, версия = 10.0.0.0, Culture = нейтральный, PublicKeyToken = 89845dcd8080cc91'.
Код в BLL выглядит следующим образом:
public bool CreateTables(string connectionString)
{
bool result = default(bool);
// Data access component declarations.
Utilities utilities = new Utilities();
// Step 1 - Calling CreateTables on Utilities.
result = utilities.CreateTables(connectionString);
return result;
}
Строка, на которую указывает ошибка:
result = utilities.CreateTables(connectionString);
Я мог бы, очевидно, добавить ссылки SMO к BLL, и тогда BLL был бы счастлив, но это нарушает мою цель разработки свободноспаренные проекты.Если я добавляю сборки SMO в BLL, он компилируется, а затем ссылка на объекты BLL на уровне служб не вызывает претензий.У меня вопрос, почему?Более конкретно: Зачем BLL нужны ссылки на SMO, когда класс Utilities
в DAL уже абстрагирует типы SMO?
Что мне нужно, чтобы вся база данных имела отношение к жизни вDAL (Дух) и только бизнес-логика в BLL (двойной Дух). Есть ли другой способ добиться этого с помощью SMO, который я упустил из виду?
Спасибо за ваше драгоценное время и ответы, я смиренно жду ваших ответов
Редактировать: я скорректировал свое решение на основе предложений Криса, проверил, что я использую ссылки на проекты (я), перечитал ссылки на SMO в DAL, используя Muse.VSExtensions, чтобы добавить ссылку GAC, прежде чем я былпросматривая и добавляя вручную, я продолжил и установил Copy Local = True для этих сборок, просто чтобы быть вдвойне уверенным, что они рядом ... но я все еще застрял с этой досадной ошибкой компиляции.