【问题标题】:How do I use Entity Framework in a CLR stored procedure?如何在 CLR 存储过程中使用实体框架?
【发布时间】:2011-02-17 02:42:39
【问题描述】:

我期待将所有逻辑(作为操作 Entity Framework 4 对象实现)移动到服务器端。它看起来很简单(由于应用程序结构)和有益的(因为我只有一台旧笔记本电脑作为客户端和一台运行 SQL Server 2008 的坚固服务器,并且为逻辑构建单独的服务只会引入更多延迟如果与在数据库中进行比较)。

那么如何在 CLR 存储过程中正确使用实体框架并使用主机服务器提供的 SqlContext 来实现?

突然间,我在网上找不到任何示例。看起来还没有人吃过这个。这是否意味着这项任务很荒谬,我绝对不应该这样做?使用 T-SQL 和直接访问表而不是 EF 类不是很方便,因为我的模型大量使用继承,并且具有非常复杂的表结构,其中包含许多非常简单的表。

【问题讨论】:

  • "还没有人这样做" ...应该敲响一些钟声。这不是应该使用 CLR 存储过程的方式。

标签: .net sql-server entity-framework stored-procedures sqlclr


【解决方案1】:

你不能——至少现在不能。 SQL Server 2005 到 2008 R2 中包含的 CLR 是 .NET 2.0 CLR - Entity Framework 4 需要 .NET 4 框架。

所以现在,在 SQL-CLR 方法中执行操作时,您仅限于直接使用 ADO.NET 2.0。

那么更大的问题仍然存在:您到底为什么要在 SQL-CLR 函数中使用 EF4?这些旨在存储过程、用户定义的函数、用户定义的聚合 - 但肯定不是成熟的数据库应用程序,真的......

【讨论】:

    【解决方案2】:

    我们中的一些人并不热衷于在两个或多个位置维护数据库架构元数据。 EF 非常适合这样做,但如果想要利用 SQL-CLR 的性能优势,则必须在其上下文中定义模式。目前,这意味着 SQL-CLR 程序集中的自定义元数据代码生成 DDL 以定义数据库并将其导入 EF。

    【讨论】:

      【解决方案3】:

      不,你不能。 Visual Studio 甚至不允许您添加文件或项目类型。 (太糟糕了,我也想这样做来处理一些非常复杂的逻辑。)

      【讨论】:

        【解决方案4】:

        似乎可以使用 SQL Server 2008 R2 或更高版本,它使用 .NET 版本。 4.0。见this blog

        我对我的 SQL Server 2010 Developer Eeition 运行以下命令:

        select value from sys.dm_clr_properties where name = 'version'
        

        得到以下输出:

        v4.0.30319

        【讨论】:

        • 这并不完全正确。首先,SQL Server 2008 R2的CLR版本还是2.0,但是可以使用Framework Version 3.5。而且,仅仅因为 SQL Server 2012、2014 和 2016 的 CLR 版本是 4.0,这并不意味着您可以导入任何您想要的框架 DLL。它仍然必须是纯 MSIL 库/DLL。如果它是混合的,那么即使它是正确的 CLR 版本,它也不会导入。
        猜你喜欢
        • 2018-06-25
        • 2014-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        相关资源
        最近更新 更多