EF从模型生成数据库删除函数导入

时间:2011-08-06 12:19:26

标签: c# sql-server entity-framework tsql ef-model-first

好的,我已经看到了这个问题Entity Framework: Generate Database From Model 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专家,这可能不是最好的方法,所以如果有更好的方法,请纠正我)

我需要在数据库中运行而不从DB导入任何内容到ASP.NET。如果您有办法将此代码转换为可转换为LINQ-to-Entities中的SQL代码的C#,也欢迎使用。

1 个答案:

答案 0 :(得分:0)

您是否在链接问题中阅读了答案?没有什么可以解决的。它根本得不到设计师的支持。数据库优先和模型优先方法是独家的。您可以使用第二个中的任何一个,但组合它们不应该使用设计器的工作流程。

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

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

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

最后你可以花一些钱购买一种工具,这样你就可以让标准设计师为你提供更多的魔力。您可以尝试Huagati EDMX tools及其model comparer的试用版。

顺便说一下。你为什么先使用模特?模型优先和代码优先是针对您不需要为您生成的蹩脚数据库以及数据库中最复杂的逻辑是自动生成ID的情况。

在我看来,模型优先或代码优先不是一个真正的应用程序,你期望更多,然后数据量少,流量小,数据库绝对没有逻辑的数据持久性。是的,您的方案首先超出了模型的范围=您正在使用MS设计师不期望的错误工作流程。