1

好的,我已经看到了这个问题Entity Framework: Generate Database From Models removes Stored Procedures from Model Store但我认为这还没有解决。我有一些功能需要在 SQL Server 上运行以进行筛选。我无法在 .NET 中编写该代码,所以我只是在 SQL Server 中将该函数编写为函数。我使用的是模型优先,但我需要在 SQL 级别使用该函数,并且我使用数据库选项中的更新模型来导入该函数。但是当我在实体设计器中进行更改并从模型生成数据库时,函数映射被删除。我知道我不应该同时使用模型优先和数据库优先,但是我该如何解决我的问题呢?我有这段无法用 C# 编写的代码,我在 LINQ 查询中需要它。当我创建导入并创建具有 EdmFunction 属性的 C# 方法时,它确实有效,该属性映射到数据库中的函数,但是我怎样才能让它持久化,以便在更新时保留我的模型和我的 SQL 函数之间的链接?编写可以在 LINQ-to-Entities 中翻译的函数是唯一的选择吗?

这是我的 SQL 函数

    create function [dbo].[HammingDistance]
    (@first bigint, @second bigint) returns int
    as
    begin
        declare @xor bigint = @first ^ @second;
        declare @one bigint = 1;
        declare @diff int = 0;
        declare @and bigint;
        while (@xor != 0)
            begin
            set @and = @xor & @one;
            if(@and = @one)
                begin
                set @diff = @diff + 1;
                end
            set @xor = @xor / 2;
            end
        return @diff;
    end

(我不是 SQL 专家,这可能不是最好的方法,所以如果有更好的方法,请纠正我)

我需要它在数据库中运行,而无需从数据库中将任何内容导入 ASP.NET。如果您有办法将此代码转换为 C# 并在 LINQ-to-Entities 中转换为 SQL 代码,那么也欢迎。

4

1 回答 1

0

您是否阅读了链接问题中的答案?没有什么需要解决的。设计师根本不支持它。数据库优先和模型优先方法是互斥的。您可以每秒使用任何一个,但将它们组合起来并不是使用设计器的工作流程。

你可以做什么?您可以为此编写自己的数据库生成工作流程 - 您将在此处找到默认工作流程:

%VSINSTALLDIR%\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen\TablePerTypeStrategy.xaml

你需要用你自己的替换第一个活动,这将在生成后将你的函数导入到 SSDL 中。您还可以尝试使用数据库生成电源包,它为数据库生成提供了更多功能,并且在这些功能中,它具有用于 SSDL 生成的 T4 模板,其中硬编码功能导入应该比创建工作流活动更容易。

最后,您可以花一些钱购买一个工具,它可以让您做比标准设计师提供给您的更多的魔法。您可以试用Huagati EDMX 工具及其模型比较器

顺便提一句。你为什么先使用模型?模型优先和代码优先适用于您不必为为您生成的糟糕数据库而烦恼并且数据库中最复杂的逻辑是自动生成的 id 的场景。

在我看来,模型优先或代码优先不适用于真正的应用程序,在这种应用程序中,您期望的只是数据量少、流量小且数据库中绝对没有逻辑的哑数据持久性。是的,您的场景超出了模型优先的范围=您使用了 MS 设计器不期望的错误工作流。

于 2011-08-06T14:06:32.260 回答