invalidOperationException在实体框架中未处理

时间:2013-12-25 09:27:08

标签: entity-framework c#-4.0

我是Entity Framework的新手。我创建了一个存储过程并将其添加到我的.edmx文件中,但问题是,当我调用它时,它会导致异常

  

从具体化的'System.Int32'类型到可为空的'System.Boolean'类型的指定强制转换无效。

这是.edmx档案

public ObjectResult<Nullable<global::System.Boolean>> uspLoginWindowsApp(global::System.String userName, global::System.String password, global::System.String userType, ObjectParameter result)
{
        ObjectParameter userNameParameter;
        if (userName != null)
        {
            userNameParameter = new ObjectParameter("UserName", userName);
        }
        else
        {
            userNameParameter = new ObjectParameter("UserName", typeof(global::System.String));
        }

        ObjectParameter passwordParameter;
        if (password != null)
        {
            passwordParameter = new ObjectParameter("Password", password);
        }
        else
        {
            passwordParameter = new ObjectParameter("Password", typeof(global::System.String));
        }

        ObjectParameter userTypeParameter;
        if (userType != null)
        {
            userTypeParameter = new ObjectParameter("UserType", userType);
        }
        else
        {
            userTypeParameter = new ObjectParameter("UserType", typeof(global::System.String));
        }

        return base.ExecuteFunction<Nullable<global::System.Boolean>>("uspLoginWindowsApp", userNameParameter, passwordParameter, userTypeParameter, result);
    }

这部分是我调用函数的代码:

private void btnLogin_Click(object sender, EventArgs e)
{
        if (_context == null)
            _context = new ATSdbEntities();

        ObjectParameter userTypeParameter = new ObjectParameter("result", false);

        // This line here is causing the error
        Boolean userExists = (Boolean)_context.uspLoginWindowsApp(txtLogin.Text.Trim(), txtPswd.Text.Trim(), cmbType.SelectedItem.ToString().Trim(), userTypeParameter).Single();

        if (userExists)
        {
            Employee emp = new Employee();
            emp.Show();
            this.Hide();
        }
        else
        {
            MessageBox.Show("Incorrect Credential ");
        }
    }

我的存储过程如下所示

    ALTER  PROCEDURE [dbo].[uspLoginWindowsApp]
@UserName varchar(50),
@Password varchar(50),
@UserType varchar(50),
@result bit output

1 个答案:

答案 0 :(得分:1)

我们还不知道你的存储过程到底是什么样的 - 假设它只需要三个varchar参数并将结果作为OUTPUT参数返回:

CREATE PROCEDURE dbo.uspLoginWindowsApp
    @UserName VARCHAR(50),
    @Password VARCHAR(50),
    @UserType VARCHAR(50),
    @Result BIT OUTPUT

然后我将此存储过程添加到Visual Studio 2012中的新.edmx并创建了函数import。

当我调用这个存储过程时,我从Entity Framework返回的是存储过程的返回值(总是INT),你要查找的结果将在{{1你作为调用的最后一个参数传入:

ObjectParameter

现在你得到了你的结果 - 无论用户是否存在。