【问题标题】:Add Entity Framework CLR DLL to SQL Server Database将实体框架 CLR DLL 添加到 SQL Server 数据库
【发布时间】:2014-10-28 02:29:15
【问题描述】:

我有一个程序在 SQL Server Express 2012 数据库上进行密集的 CRUD 操作。我希望创建一个包含大部分代码的 CLR 程序集,然后将其附加到数据库中,以便保留在服务器上。我希望对特定表中的每一行执行资源密集型计算,然后将该计算的结果输入到该表中的一列(不参与计算本身)。我希望它保留在服务器上,以便服务器可以自动进行计算,而无需前端应用程序调用它,也无需应用程序从服务器来回提交 TSQL。我还想使用 Entity Framework 在 VB.NET 中编写代码以使事情变得更容易。

在编写真正的程序之前,我决定使用 AdventureWorks2012 尝试这种方法。我在 Visual Studio 中创建了一个类库,然后以发布模式构建。然后我进入 SQL Server Management Studio,右键单击 Databases > AdventureWorks2012 > Programmability > Assemblies 节点,然后单击“New Assembly...”,导航到我构建的 DLL 并单击 OK,但是 SQL Server Management Studio 给了我这个错误信息:

TITLE: Microsoft SQL Server Management Studio
------------------------------

Create failed for SqlAssembly 'AdventureWorks_01'.  (Microsoft.SqlServer.Smo)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=11.0.5058.0+((SQL11_PCU_Main).140514-1820+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=Create+SqlAssembly&LinkId=20476

------------------------------
ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------

Assembly 'entityframework, version=6.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.' was not found in the SQL catalog. (Microsoft SQL Server, Error: 6503)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=11.00.5058&EvtSrc=MSSQLServer&EvtID=6503&LinkId=20476

------------------------------

我注意到这要求一个 entityframework 程序集,并且在 build 文件夹中有一个,所以我尝试使用相同的方法添加它,但我收到以下错误消息:

TITLE: Microsoft SQL Server Management Studio
------------------------------

Create failed for SqlAssembly 'EntityFramework'.  (Microsoft.SqlServer.Smo)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=11.0.5058.0+((SQL11_PCU_Main).140514-1820+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=Create+SqlAssembly&LinkId=20476

------------------------------
ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------

Assembly 'system.runtime.serialization, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.' was not found in the SQL catalog.
Warning: The Microsoft .NET Framework assembly 'entityframework, version=6.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil.' you are registering is not fully tested in the SQL Server hosted environment and is not supported. In the future, if you upgrade or service this assembly or the .NET Framework, your CLR integration routine may stop working. Please refer SQL Server Books Online for more details. (Microsoft SQL Server, Error: 6503)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=11.00.5058&EvtSrc=MSSQLServer&EvtID=6503&LinkId=20476

------------------------------

我还在文件夹中看到了一个名为EntityFramework.SqlServer.dll的DLL,所以我尝试添加它,但它产生了第一条错误消息。

这是我的 VB 代码:

Public Class Class1
    Sub AddNewProduct()
        Dim adWorks As New AdventureWorks2012Entities()
        Dim myProduct = New Product()

        With myProduct
            'add applicable product info here
        End With

        adWorks.Products.Add(myProduct)
    End Sub
End Class

有谁知道我可以如何解决这个问题,或者我是否可以首先将 Entity Framework CLR 程序集添加到 SQL Server 数据库?

【问题讨论】:

  • 将这些程序集添加到 Sql Server 中似乎很奇怪。你的程序会在服务器上运行吗?尝试将这些程序集放入 Sql Server 的原因是什么?
  • 我希望做的是让数据驻留在服务器上。根据这些数据,将对特定表中的每一行执行资源密集型计算,然后将该计算的结果输入到该表的列中(不参与计算本身)。我希望这将保留在服务器上,以便服务器可以自动进行计算,而无需前端应用程序调用它,也无需应用程序从服务器来回提交 TSQL。
  • 编写一个小控制台应用程序或驻留在服务器上的 Windows 服务来执行此操作似乎更容易,更合适。
  • 感谢您的建议,@Dan-o。我没有想到这种方法。我会尝试一下,看看它是如何工作的。

标签: .net sql-server vb.net entity-framework sqlclr


【解决方案1】:

您需要加载链中的所有依赖程序集,因为某些程序集依赖于其他程序集。即 System.Runtime.Serialization 也需要加载 t/b。 MSDN 也有关于这个主题的完整部分,希望这些链接会有所帮助:

(支持的 .NET Framework 库)
http://msdn.microsoft.com/en-us/library/ms403279.aspx
对于不受支持的程序集,这有点意味着程序集没有预加载在 SQL Server 上,只需通过 Create Assembly(请参阅有关此的 MSDN 文档) 在 SSMS 中或您一直在做的那样添加它们

(CLR 集成编程模型限制)
http://msdn.microsoft.com/en-us/library/ms403273.aspx

在 MSDN 上,您还会看到有关调试 SQL CLR 代码的部分

【讨论】:

  • 感谢@KVigor 的输入,但我仍然遇到问题(特别是Permission Set)。请给我一个演练好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多