2016-10-07 2 views
0

Я пытаюсь солить свои пароли.Ошибка при вызове процедуры Entity Framework с параметром вывода

Вот мой sproc, который возвращает мой PW как NVARCHAR (512):

alter proc [dbo].g_GetPWFromEmail 
@emailAddress nvarchar(50), 
@EncrPass nvarchar(512) OUTPUT 

as 
if ((Select count(*) from users where emailAddress = @emailAddress) > 0) 
begin 
    select @EncrPass = password 
    from users 
    where emailAddress = @emailAddress 
end 
else 
begin 
    select @EncrPass = '' 
end 

Вот что scaffolded в файле emdx:

public virtual ObjectResult<string> g_GetPWFromEmail(string emailAddress, ObjectParameter encrPass) 
{ 
    var emailAddressParameter = emailAddress != null ? 
     new ObjectParameter("emailAddress", emailAddress) : 
     new ObjectParameter("emailAddress", typeof(string)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<string>("g_GetPWFromEmail", emailAddressParameter, encrPass); 
} 

И когда я называю это это ошибки вне ... не знаю, как это назвать - вот то, что я до сих пор:

//Pull Current Encrypted Password from DB 
string DbPw = ""; 
ObjectParameter DBPW1 = null; 
var DbPassWord = databaseManager.g_GetPWFromEmail(model.Username, DBPW1).ToList(); 
if (DbPassWord != null && DbPassWord.Count() > 0) 
{ 
    DbPw = Convert.ToString(DBPW1); 
} 

Как назвать это вернуть мою хэшировал pw из БД? Я знаю, что есть лучший способ, но попробовал несколько способов и не мог правильно получить синтаксис.

+0

В чем смысл сохранения хранимой процедуры? Вы пытаетесь проверить, соответствует ли хэш тем, что находится в базе данных (как это вы должны делать)? – DavidG

+0

Многие вещи могут быть улучшены ... Ваш метод 'g_GetPWFromEmail()' возвращает строку, поэтому нет необходимости преобразовывать ее в строку, это строка ... Она начинается с строчного символа и имеет знак подчеркивания (против [Соглашения о присвоении имен Microsoft] (https://msdn.microsoft.com/en-us/library/ms229045 (v = vs.110) .aspx)). Вместо '~ = null && Count()> 0' вы должны использовать' string.IsNullorWhiteSpace() '. То, как вы выполняете процедуры, невероятно устарело, прочитайте [Execute SP] (http://www.entityframeworktutorial.net/EntityFramework4.3/execute-stored-procedure-using-dbcontext.aspx). –

+0

Точно - Да - я пытаюсь проверить, соответствует ли хэш тем, что находится в базе данных (так как это то, что вы должны делать). Я просто не могу заставить этот код работать! Любые мысли будут восприняты. Если вы посмотрите на связанный сайт, вы увидите вспомогательный файл. –

ответ

1

Если ваш случай использования действительно это простое, то регулярные LINQ к Entities будет работать, если вы настроили свои таблицы, как лица:

using (var context = new MyContext()) { 
    string encryptedPassword = context.Users 
     .Where(u => u.emailAddress == emailAddress) 
     .Select(u => u.password) 
     .SingleOrDefault(); 
} 
+0

Спасибо! Это то, что я искал. Все еще разрабатываем детали ... Оставайтесь с нами. –

0

Вы передаете пустую ссылку (DPBW1) в метод. Поэтому метод не может обновить эту ссылку с выходным значением.

ObjectParameter DBPW1 = null; 
var DbPassWord = databaseManager.g_GetPWFromEmail(model.Username, DBPW1).ToList(); 

Я не сделал этого в EF, но в SQL ADO.NET, вы по-прежнему создать параметр и просто отметьте направление параметра, как выход, то после запуска прок, то значение параметра заполняется.

Вы должны быть в состоянии сделать то же самое здесь.

EDIT Похоже, ObjectParameter не определяет направление параметра. Возможно, это сделано автоматически - я должен попробовать, чтобы посмотреть, работает ли это.

var DPBW1 = new ObjectParameter("EncrPass", typeof(string)); 

EDIT Это делает работу без установки направления параметра

Смежные вопросы