我使用以下方法在谷歌上搜索了答案:
“'Microsoft.SqlServer.Management.Smo.Server' 类型在未引用的程序集中定义。”
为什么在 DAL 中使用 Microsoft Sql Server 管理对象 (SMO) 需要在引用的项目中引用 SMO dll?
在引用的项目中使用 sql smo
分层解决方案中的sql smo
sql smo 参考要求
可能还有其他一些人还没有找到这个问题的解决方案或解释。
诚然,我只是一个熟练的 googler,所以如果有人想给我力量等级并指出现有资源的方向,我很乐意从那里开始探索。
这是我的设置:
我有一个分层的解决方案:DAL、业务逻辑、服务、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 类(a la intellisense)。但是,当我编译时,我得到:
类型“Microsoft.SqlServer.Management.Smo.Server”在未引用的程序集中定义。您必须添加对程序集“Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, 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 对象不会引起投诉。我的问题是,为什么?更具体地说:当DAL 中的类已经抽象出 SMO 类型时,为什么 BLL 需要对 SMO 的引用?Utilities
我想要的是所有与 DAL 相关的数据库(duh),并且只有 BLL 中的业务逻辑(double duh)。 是否有另一种方法可以使用我忽略的 SMO 来实现这一目标?
感谢您宝贵的时间和答案,我虚心等待您的回复
编辑:我已经根据 Chris 的建议调整了我的解决方案,验证了我正在使用项目 refs(我是),在我浏览和手动添加,然后我继续为这些程序集设置 Copy Local = True 只是为了确保它们在附近......但我仍然遇到这个烦人的编译错误。