Ошибка импорта функции SQL Server в Entity Framework ADO.NET Entity Data Model

Мой проект основан на модели данных ADO.NET Entity, и я использую Entity Framework 6.0.

Ну, я получил эту ошибку, когда я импортирую функцию в моем проекте:

Ошибка 6046: Невозможно сгенерировать возвращаемый тип функции импорта функции хранилища 'fn_PWDCOMPARE'. Функция сохранения будет проигнорирована, и импорт функции не будет сгенерирован.

Я не получаю ошибку, если я импортирую процедуру.

Функция:

CREATE FUNCTION fn_PWDCOMPARE (@pwd NVARCHAR(MAX),@pwdhash NVARCHAR(MAX))
RETURNS BIT
BEGIN
  RETURN PWDCOMPARE(@pwd, @pwdhash)
END

2 ответа

EF 6.1.3 до сих пор не генерирует код для скалярных функций. Тем не менее, вы можете расширить свой класс DbContext и добавить свою собственную реализацию в вашу функцию. После этого вы можете вызывать свою функцию как любой другой объект внутри вашей EF-модели.

Создайте файл, содержащий [частичный класс] в том же [пространстве имен], что и ваша модель БД, и с тем же именем контекста модели. И добавьте этот код:

public partial class YourDBContext : DbContext
{
    public System.Data.Entity.Core.Objects.ObjectContext AsObjectContext()
    {
        return (this as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext;
    }

    [DbFunction("YourDBModel.Store", "fn_PWDCOMPARE")]
    public bool fn_PWDCOMPARE(string pwd, string pwdhash)
    {
        var paramList = new ObjectParameter[]
        {
            new ObjectParameter("pwd", pwd),
            new ObjectParameter("pwdhash", pwdhash)
        };

        return this.AsObjectContext().CreateQuery<bool>("YourDBModel.Store.fn_PWDCOMPARE", paramList).Execute(MergeOption.NoTracking).FirstOrDefault();
    }

Затем вы просто вызываете эту новую функцию из своего кода:

bool retVal = YourDBContext.fn_PWDCOMPARE (pass, hash);

С EF 6.1.3 + MySQL 8.0.23 + MySql Net Connector 8.0.20 + MySql для Visual Studio 1.2.9 + VS 2019 Commnunity 16.9.3 у меня нет никаких проблем.

Но после обновления до VS 2019 Commnunity 16.9.4 ничего не работает: при импорте пользовательской функции mySql, чем возвращается целое число, генерируется ошибка:

      Severity    Code    Description Project File    Line    Suppression State
Warning     Error 6046: Unable to generate function import return type of the store function 'getCodes'. The store function will be ignored and the function import will not be generated.  DalLayer    ... \ModelMySql.edmx

Я расширил класс DbContext этой функцией:

      namespace DalLayer.Tel
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Core.Objects;
    using System.Data.Entity.Infrastructure;

    public partial class ModelEntitiesMySql : DbContext
    {
        public System.Data.Entity.Core.Objects.ObjectContext AsObjectContext()
        {
            return (this as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext;
        }

        [DbFunction("ModelMySql.Store", "getCodes")]
        public int getCodes(string Email , int CodeType)
        {
            var paramList = new ObjectParameter[]
            {
            new ObjectParameter("Email", Email),
            new ObjectParameter("CodeType", CodeType)
            };

            //HERE FIRED THE ERROR
            var r1 = this.AsObjectContext().CreateQuery<int>("ModelMySql.Store.getCodes", paramList).Execute(MergeOption.NoTracking);
            
            if (r1 != null)
            {
                var r2 = r1.FirstOrDefault();
                return r2;
            }
            else
            {
                return 0;
            }
        }
    }
}
Другие вопросы по тегам