不能为可组合函数创建函数导入

本文关键字:函数 创建 导入 可组合 不能 | 更新日期: 2023-09-27 17:54:56

我已经为我的数据库对象生成了实体CodeBlock,并选择了一些用户定义的标量函数。但是当我试图双击模型中的函数时。存储导入函数,我得到这个错误。

不能为可组合函数创建函数导入。

如何导入函数?

不能为可组合函数创建函数导入

我不知道我在ExecuteFunction中看到了什么,但它不起作用。在这篇文章和其他回复中的文章的帮助下,我终于得到了一个端到端的解决方案。

第一步是将函数放入EDMX文件:

    <Function Name="ProcessReplacements" ReturnType="nvarchar(max)" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="Data">
      <Parameter Name="VersionId" Type="uniqueidentifier" Mode="In" />
      <Parameter Name="SurveyId" Type="uniqueidentifier" Mode="In" />
      <Parameter Name="Input" Type="nvarchar(max)" Mode="In" />
    </Function>

第二步是在与EDMX文件相同的名称空间中设置一个类(通过在与EDMX文件相同的目录中创建类可以轻松完成:

using System.Data.Objects.DataClasses;
namespace Same.As.Edmx
{
    public static class EdmFunctions
    {
        [EdmFunction("SurveyDesignerModel.Store", "ProcessReplacements")]
        public static string ProcessReplacements(Guid VersionId, Guid SurveyId, string Input)
        {
            throw new NotSupportedException("Direct calls are not supported.");
        }
    }
}

第三步是编写一个指向函数的对象查询:

    using System.Data.Objects;
    protected string ProcessReplacements(Guid versionId, Guid surveyId, string input)
    {
        if (input == null)
            return null;
        List<ObjectParameter> parameters = new List<ObjectParameter>(3);
        parameters.Add(new ObjectParameter("VersionId", versionId));
        parameters.Add(new ObjectParameter("SurveyId", surveyId));
        parameters.Add(new ObjectParameter("Input", input));
        var output = db.CreateQuery<string>("SurveyDesignerModel.Store.ProcessReplacements(@VersionId, @SurveyId, @Input)", parameters.ToArray())
            .Execute(MergeOption.NoTracking)
            .FirstOrDefault();
        return output;
    }

对我来说关键是CreateQuery调用对象上下文和"查询字符串"的语法。注意对EDMX中定义的函数的完全限定引用,这是我缺少的链接:-)

正确。不能为SQL函数创建函数导入,只能为SQL存储过程创建函数导入。您可以将SQL函数导入到存储模型中,但必须手动创建方法来调用该函数:

public static class EdmFunctions
{
    [EdmFunction("TestModel.Store", "FunctionName")]
    public static string SomeName(string someParam)
    {
        throw new NotSupportedException("This function is only for L2E query.");
    }
}

EdmFunction中的Namespace必须为存储容器的Namespace (EDMX文件中的SSDL), name必须为导入函数的名称。在。net代码中调用这个方法是没有意义的。因此它抛出异常。它只适用于转换为SQL = linq-to-entities的查询。

我有同样的问题,并成功地解决了它。关于这个主题的原始MSDN文章在这里:如何:调用自定义数据库函数