Импорт функций не может быть создан для составных функций - PullRequest
14 голосов
/ 03 мая 2011

Я сгенерировал Entity CodeBlock для своих объектов базы данных и выбрал некоторые из моих пользовательских скалярных функций. Но когда я попытался дважды щелкнуть по функции в Model.Store для импорта функции, я получил эту ошибку.

Импорт функций не может быть создан для компонуемых функций.

Как я могу импортировать свои функции?

Ответы [ 3 ]

8 голосов
/ 29 сентября 2011

Я не знаю, что я видел с 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, это было мое недостающее звено: -)

3 голосов
/ 03 мая 2011

Это правильно.Вы не можете создать импорт функции для функции 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 должно быть пространством имен контейнера хранилища (SSDL в файле EDMX) и имябыть именем импортируемой функции.Этот метод не имеет смысла при вызове в коде .NET.Из-за этого он бросает исключение.Это только для запросов, переведенных в SQL = linq-to-entity.

2 голосов
/ 24 июня 2011

У меня была такая же проблема, и я успешно ее решил.Оригинальная статья MSDN на эту тему находится здесь: Как: вызывать пользовательские функции базы данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...