我们正在使用4.7.2和最新的EF 6.2转换部分业务层。 在CLR存储过程中使用Entity Framework
https://patrickdesjardins.com/blog/how-to-use-third-party-dll-reference-in-a-sql-clr-function
因此,为了利用已经经过充分测试的代码的现有投资,我们希望将某些业务层移动到数据库中。然而,当发布时我们遇到了问题。
创建[System.Dynamic]...
警告:Microsoft .NET Framework程序集'system.dynamic, version=4.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.'的注册未在SQL Server托管环境中进行充分测试,因此不受支持。将来,如果您升级或服务此程序集或.NET Framework,则您的CLR集成例程可能会停止工作。请参阅SQL Server Books Online以获取更多详细信息。
(47,1):SQL72014:.Net SqlClient数据提供程序:
Msg 6218,Level 16,State 2,Line 1
为程序集'System.Dynamic'创建程序集失败,因为程序集'System.Dynamic'无法验证。检查所引用的程序集是否已经最新并且受信任(对于external_access或unsafe)在数据库中执行。
如果有任何CLR验证器错误消息,将在此消息之后跟随此消息[:
System.Dynamic.ArgBuilder::MarshalToRef][mdToken=0x6000002][offset 0x00000000]代码大小为零。[: System.Dynamic.ArgBuilder::UnmarshalFromRef][mdToken=0x6000003][offset
P.S.(在我看来,无论是使用EF Core还是EF6.2都没有关系,尽管如此,我们正在尝试使用EF6.2)
编辑: 已经给所有我所引用的程序集授予了UNSAFE权限: 以下是所有依赖项:
<ItemGroup>
<Reference Include="Microsoft.CSharp">
<HintPath>..\packages2019\dotnet 4.7.2\Microsoft.CSharp.dll</HintPath>
<SqlPermissionSet>UNSAFE</SqlPermissionSet>
<GenerateSqlClrDdl>True</GenerateSqlClrDdl>
<IsModelAware>True</IsModelAware>
<SpecificVersion>True</SpecificVersion>
</Reference>
<Reference Include="System.Dynamic">
<HintPath>..\packages2019\dotnet 4.7.2\System.Dynamic.dll</HintPath>
<SqlPermissionSet>UNSAFE</SqlPermissionSet>
<GenerateSqlClrDdl>True</GenerateSqlClrDdl>
<IsModelAware>True</IsModelAware>
<SpecificVersion>True</SpecificVersion>
</Reference>
<Reference Include="System.Runtime.Serialization">
<HintPath>..\packages2019\dotnet 4.7.2\System.Runtime.Serialization.dll</HintPath>
<SqlPermissionSet>UNSAFE</SqlPermissionSet>
<GenerateSqlClrDdl>True</GenerateSqlClrDdl>
<IsModelAware>True</IsModelAware>
<SpecificVersion>True</SpecificVersion>
</Reference>
<Reference Include="SMDiagnostics">
<HintPath>..\packages2019\v4.0.30319\SMDiagnostics.dll</HintPath>
<SqlPermissionSet>UNSAFE</SqlPermissionSet>
<GenerateSqlClrDdl>True</GenerateSqlClrDdl>
<IsModelAware>True</IsModelAware>
<SpecificVersion>True</SpecificVersion>
</Reference>
<Reference Include="System.ServiceModel.Internals">
<HintPath>..\packages2019\v4.0.30319\System.ServiceModel.Internals.dll</HintPath>
<SqlPermissionSet>UNSAFE</SqlPermissionSet>
<GenerateSqlClrDdl>True</GenerateSqlClrDdl>
<IsModelAware>True</IsModelAware>
<SpecificVersion>True</SpecificVersion>
</Reference>
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll</HintPath>
<SqlPermissionSet>UNSAFE</SqlPermissionSet>
<SpecificVersion>True</SpecificVersion>
<IsModelAware>True</IsModelAware>
<GenerateSqlClrDdl>True</GenerateSqlClrDdl>
</Reference>
<Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll</HintPath>
<SqlPermissionSet>UNSAFE</SqlPermissionSet>
<SpecificVersion>True</SpecificVersion>
<IsModelAware>True</IsModelAware>
<GenerateSqlClrDdl>True</GenerateSqlClrDdl>
</Reference>
EDIT 3: Azure SQL Server MI中存在不安全的代码
![在此输入图片描述](https://istack.dev59.com/94p98.webp)
- 致命问题是:
System.RunTime.Serialization
CREATE ASSEMBLY [System.Runtime.Serialization]
AUTHORIZATION [dbo]
FROM 0x4D5...
WITH PERMISSION_SET = UNSAFE;
我无法创建将Entity Framework UNSAFE程序集插入到数据库中的程序。我们能否绕过system.Runtime.Serialization?
GO
CREATE ASSEMBLY [EntityFramework]
AUTHORIZATION [dbo]
FROM 0x4D5A90...
WITH PERMISSION_SET = UNSAFE;
GO
PRINT N'Creating [EntityFramework.SqlServer]...';
GO
CREATE ASSEMBLY [EntityFramework.SqlServer]
AUTHORIZATION [dbo]
FROM 0x4...
WITH PERMISSION_SET = UNSAFE;
警告:您正在注册的Microsoft .NET Framework程序集 “system.runtime.serialization,版本=4.0.0.0,culture=neutral, publickeytoken=b77a5c561934e089.”未在SQL Server托管环境中进行完全测试,因此不受支持。将来,如果您升级或为此程序集或.NET Framework提供服务,则您的CLR集成例程可能会停止工作。有关详细信息,请参见SQL Server图书在线。Msg 6218,级别16,状态2,行11创建用于程序集'System.Runtime.Serialization'失败,因为程序集'System.Runtime.Serialization' 验证失败。检查所引用的程序集是否已经更新且被信任(对于external_access或unsafe)以在数据库中执行。如果有CLR验证器错误消息,则会跟随此消息[:System.AppContextDefaultValues :: PopulateDefaultValues] [mdToken = 0x6000001] [偏移量0x00000000]代码大小为零。