【问题标题】:Error when adding assembly to SQL Server 2012将程序集添加到 SQL Server 2012 时出错
【发布时间】:2014-12-19 04:33:37
【问题描述】:

如果有人能就我的问题提出建议,我将不胜感激。

我有一个 EF 版本 4.5 的类库项目。

项目的App.Config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
  <connectionStrings>
    <add name="Entities" connectionString="..." providerName="System.Data.EntityClient"/>
    <add name="REPORTSEntities" connectionString="..." providerName="System.Data.EntityClient"/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>
  </entityFramework>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>

当我尝试将 dll 添加到 SQL Server 2012 时,我收到错误:

Assembly 'entityframework, version=5.0.0.0,culture=neutral,publickeytoken=b77a5c561934e089.'在 SQL 目录中找不到。 (错误:6503)

我做错了什么?

非常感谢。

【问题讨论】:

  • 先尝试将所需的EntityFramework程序集添加到SQL Server
  • @JesseJames,当我尝试添加它时,我得到另一个错误:未找到 system.data.entity。您正在注册的 assebmly entityframework 未在 SQL Server 托管环境中进行全面测试,因此不受支持。将来,如果您升级或维护此程序集或 .NET 框架,您的 CLR 集成例程可能会停止工作。
  • 检查这个线程。它关于你的错误。 stackoverflow.com/questions/2304357/…
  • 感谢您的链接,那么我应该注册哪个程序集?当我尝试创建 EF 程序集时,它需要 System.Data.Entity。这又需要 system.runtime.serialization 等等..
  • 嗯,但是为什么要向 SQL Server 添加程序集呢?这称为SQL Server CLR Integration,用于对 SQL Server 和数据执行复杂的操作。如果您仍然需要它,您应该将 sqlopeartion 提取到另一个不会引用实体框架的程序集中

标签: c# sql-server visual-studio-2012 sql-server-2012 .net-assembly


【解决方案1】:

SQL Server 的 CLR 主机在设计上受到相当的限制/限制。这是受支持的 .NET Framework 库的列表(找到 here)。请注意,这是一个相当短的列表,实体框架不在其中。

  • 自定义编组器
  • Microsoft.VisualBasic
  • Microsoft.VisualC
  • mscorlib
  • 系统
  • 系统配置
  • System.Data
  • System.Data.OracleClient
  • System.Data.SqlXml
  • System.Deployment
  • 系统安全
  • System.Transactions
  • System.Web.Services
  • System.Xml
  • System.Core.dll
  • System.Xml.Linq.dll

我无法想象当您在数据库本身内部运行时为什么需要加载数据访问框架。公平地说,如果您将它们全部加载为UNSAFE,您可以执行此操作,假设它们都是纯 MSIL 并且没有混合。但加载 _un_supported .NET Framework 库的几个风险之一是,如果它们随时间变化(通过 Windows 更新或手动更新),那么您在 SQL Server 中运行的代码可能会停止工作。如果它只是一个更新版本,那么您需要手动更新必须加载到 SQL Server 中的相关 .NET Framework DLL,以便首先使其正常工作。但是,如果其中一个 DLL 更改为在更新中混合,那么您将无法将更新后的版本加载到 SQL Server 中,并且必须更改您的代码以不再需要该 DLL。

但是,如果您确实加载了它,然后在引用 EF DLL 的完整路径时执行 CREATE ASSEMBLY,它应该会自动拉入所有依赖项。

综上所述,您确定需要将任何 DLL 加载到 SQL Server 中吗?没有理由为在 SQLCLR 中运行的任何东西创建一个 app.config 文件。

【讨论】:

  • 问题是我有一个复杂的逻辑来构建存储过程。这就是为什么我决定用 C# 编写代码并在我的 sp 中使用汇编。这是错误的方式吗?有什么选择吗?
  • @GyuzalR 复杂的逻辑绝对是使用 SQLCLR 的好理由。但是在 SQLCLR 中使用实体框架?我不认为这是一种好处。而且它可能并不总是按预期工作。
  • 好的..但是我如何在没有 EF 的情况下在我的逻辑中使用数据库数据呢?使用 System.Data.SqlClient 的 SQL 连接类?
  • 是的,完全正确。并使用"Context Connection = true;" 作为连接字符串。转到 www.sqlservercentral.com ,然后转到 Stairways,然后找到 Stairway to SQLCLR。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多