使用输出参数调用Entity Framework过程时出错

时间:2016-10-07 16:46:37

标签: c# 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

以下是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?我知道有更好的方法,但尝试了几种方法,并且无法使语法完全正确。

2 个答案:

答案 0 :(得分:1)

如果您的用例真的很简单,那么假设您已将表设置为实体,那么常规的LINQ到实体将会起作用:

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

答案 1 :(得分:0)

您将空引用(DPBW1)传入方法。因此,该方法无法使用输出值更新该引用。

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

我没有在EF中完成此操作,但在SQL ADO.NET中,您仍然创建参数并将参数方向标记为Output,然后在proc运行后填充参数值。

你应该能够在这里做同样的事情。

编辑看起来ObjectParameter没有定义参数方向。也许它是自动完成的 - 我必须尝试看它是否有效。

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

编辑无需设置参数方向即可正常工作