【问题标题】:Integer method always return "-1"?整数方法总是返回“-1”?
【发布时间】:2016-10-14 18:49:49
【问题描述】:

我是 ASP.net MVC 的新手,我正在尝试构建一个非常基本的登录表单,一切正常,我添加了登录方法的存储过程和“添加功能导入”,问题是在所有情况下它总是返回一个值“-1”。一起来看看吧……

1- MovableAssetsDB.context.cs

public virtual int LoginToMovable(string userName, string password)
    {
        var userNameParameter = userName != null ?
            new ObjectParameter("UserName", userName) :
            new ObjectParameter("UserName", typeof(string));

        var passwordParameter = password != null ?
            new ObjectParameter("Password", password) :
            new ObjectParameter("Password", typeof(string));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("LoginToMovable", userNameParameter, passwordParameter);
    }

2- 我创建了一个名为“Data”的类来处理方法并调用存储过程

public int Login(string username, string password)
    {
        using (var DBcontext = new MovableAssetsEntities())
        {
             int userId = DBcontext.LoginToMovable(username, password);
            return userId;
        }

    }

3-在“主页”视图中,这里是处理登录过程的表单代码和剃须刀代码

    @{
    Layout = null;
}

@{
    ViewBag.Title = "Login";
}



@{ 
    if (IsPost)
    {
        string username = Request.Form["username"];
        string password = Request.Form["password"];

        int userId = new MovableAssets.Classes.Data().Login(username, password);

        if (userId > 0)
        {
            <script>alert("yes");</script>

        }
        else
        {
            <script>alert("No");</script>
        }
    }

}

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Movable Assets</title>
    <link rel="stylesheet" href="@Url.Content("~/Content/Custom/css/style.css")">
</head>

<body>
    <div class="container">
        <p id="home_title">Movable Assets</p>
        <section id="content">
            <form action="#" method="post">
                <h1>Login</h1>
                <div>
                    <input type="text" placeholder="Username" required="" id="username" name="username" />
                </div>
                <div>
                    <input type="password" placeholder="Password" required="" id="password" name="password" />
                </div>
                <div>
                    <input type="submit" value="Log in" />
                </div>
            </form><!-- form -->
        </section><!-- content -->
    </div><!-- container -->
</body>
</html>

4-存储过程

  ALTER PROCEDURE [dbo].[LoginToMovable]
    @UserName nvarchar(50),
    @Password nvarchar(50)
AS
BEGIN

    SET NOCOUNT ON;

    SELECT ID FROM Utilities.dbo.Users WHERE Utilities.dbo.Users.LogIn = @UserName AND Utilities.dbo.Users.Password = @Password
    AND AppCode = '9'
END

每当我写下任何登录凭据时,我都会将 userId 的值设为 -1 任何建议?!

【问题讨论】:

  • 把 LoginToMovable SP 代码放在这里。
  • 请显示 LoginToMovable 代码
  • ObjectContext.ExecuteFunction 丢弃从函数返回的任何结果;并返回受执行影响的行数(参见msdn.microsoft.com/en-us/library/dd986915(v=vs.110).aspx)。会不会是这个原因?
  • 你知道是EDM自动生成的,不是我写的,有替代代码吗?

标签: c# asp.net asp.net-mvc entity-framework razor


【解决方案1】:

存储过程的 EF 模型返回 -1,因为从 EF 调用存储过程的默认行为是返回其最后一条语句修改的行数。由于最后一条语句是SELECT,因此您会得到-1,因为SELECTs 无法修改行:

https://stackoverflow.com/a/2203421/1945651

为了获得您的程序选择的值,您需要修改模型:

  1. 为您的 EF 模型打开模型浏览器。
  2. 找到Function Imports下的存储过程并双击它打开Edit Function Imports对话框。
  3. Returns a Collection Of 框中,选择 Scalars 和您期望的类型。
  4. 单击确定,然后重新保存您的 EF 模型。

DBcontext.LoginToMovable() 现在应该返回一个值的集合。调用后,从集合中选择第一个元素,得到你想要的值。

【讨论】:

  • 你说的都已经完成了,我又做了一遍,但还是不行
  • @Medo 它还返回-1吗?你确定重新保存模型了吗?您能给我们看一张该存储过程的Edit Function Import 对话框的屏幕截图吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2013-02-23
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多