【问题标题】:Error calling Entity Framework procedure with output parameter使用输出参数调用实体框架过程时出错
【发布时间】:2016-10-08 01:23:35
【问题描述】:

我正在尝试为我的密码加盐。

这是我的存储过程,它以 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);
}

如何调用它以从数据库返回我的散列密码?我知道有更好的方法,但尝试了几种方法,但语法都不太正确。

【问题讨论】:

  • 存储过程的意义何在?您是否尝试检查哈希是否与数据库中的内容匹配(因为这是您应该做的)?
  • 很多东西可以改进...你的方法g_GetPWFromEmail()返回一个字符串,所以不需要将它转换为字符串,它是一个字符串...它以小写字符开头并且有一个下划线(针对Microsoft Naming Conventions)。您应该使用string.IsNullorWhiteSpace() 而不是~= null &amp;&amp; Count() &gt; 0。您执行程序的方式非常古老,请阅读Execute SP
  • 完全正确-是的-我正在尝试检查哈希是否与数据库中的内容匹配(因为这是您应该做的)。我就是无法让这段代码工作!!任何想法都会受到赞赏。如果您查看链接的站点,您将看到帮助文件。
  • 最后,您为什么要尝试重新发明轮子,而不使用经过测试的框架进行身份验证?例如Asp.Net Identity(默认情况下)?
  • 我已经有一个用户数据库在运行,我正在迁移到一个新的数据库。我已解密该 userDB 并且不确定如何加密,最好使用 Asp.Net Identity。正在努力,但截止日期很紧。

标签: c# entity-framework


【解决方案1】:

如果您的用例真的这么简单,那么常规的 LINQ-to-Entities 将起作用,假设您已将表设置为实体:

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

【讨论】:

  • 谢谢!这就是我一直在寻找的。仍在研究细节...敬请期待。
【解决方案2】:

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

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

我在 EF 中没有这样做,但是在 SQL ADO.NET 中,你仍然创建参数并将参数方向标记为输出,然后在 proc 运行后,填充参数值。

你应该可以在这里做同样的事情。

EDIT 看起来ObjectParameter 没有定义参数方向。也许它是自动完成的——我得试试看它是否有效。

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

EDIT 不用设置参数方向也可以工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2011-04-26
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多