Ошибка импорта функции 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;
}
}
}
}