实体框架(现有数据库)

时间:2016-05-11 15:04:02

标签: c# entity-framework

我是ASP.NET MVC的新手,并且不知道此时的内容是什么。我花了很多时间试图找出我认为应该非常简单的内容并在网上搜索了一下!

我创建了一个ASP.NET MVC项目,该项目预先填充了“登录和注册”页面等内容。

我获得了实体框架来连接/使用我现有的数据库并希望注册用户(即将新用户插入数据库)。使用预先填充的代码工作,但插入“内部数据库”,这不是我想要的,但使用async await在尝试插入我的现有数据库时不起作用(在{的行中给出了错误{1}}无法转换为Model.User或其他类似的东西),所以我现在正在同步进行,但非常喜欢它所做的验证(即检查用户是否已经存在等等,我现在编码了自己)。

(抱歉所有打字)

现在我想登录,这是代码:

Model.DB.User

但这失败了。我在[AspNetUsers]表中挖了一些更深的搜索?如何在现有数据库中的MY Employee表中进行搜索?我喜欢验证,并根据我读到的async和await的内容,id喜欢继续使用它。

最后我的问题是我怎样才能让上面的代码从我的实体框架(现有数据库)中读取而不是从这个“内部数据库”中读取?

我希望这是有道理的。

感谢您的帮助。

编辑:

以下是正在使用的LoginModelView类:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, change to shouldLockout: true
    var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, isPersistent:false, shouldLockout: false);

    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);

        case SignInStatus.LockedOut:
            return View("Lockout");

        //case SignInStatus.RequiresVerification:
        //    return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });

        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
            return View(model);
    }
} 

我的public class LoginViewModel { public string FirstName { get; set; } public string Surname { get; set; } public string Email { get; set; } [Required] [Display(Name = "User Name")] public string UserName { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } public DateTime LastLoggedIn { get; set; } public bool isLockedOut { get; set; } public bool isAuthorized { get; set; } public bool isActive { get; set; } } 表包含以下列(如果这甚至很重要):

Employee

1 个答案:

答案 0 :(得分:1)

您尝试使用的内容称为ASP.NET Identity。它是用户管理,身份验证,授权等的框架。默认情况下,它使用实体框架来访问数据库(如果它不存在则会创建它),但具体实现将需要特定的表。你有几个选择,但我担心没有简单的选择。

  1. 让ASP.NET Identity将其表创建为新数据库,编写脚本,将它们放入数据库,将连接字符串更改为指向数据库,并在数据库中安装登录系统。这里的问题是它不会使用你的表。如果您的数据库是新的并且您可以控制设计,则可以更改这些表(以及相应的类(如User))以存储所需的数据(例如,您可以将EmployeeNumber添加到AspNetUsers表)。缺点是你不能只使用你的Employee表。您必须接受预定义表作为模型的一部分。现在,如果使用Employee表进行登录是一个好主意,但仍然是值得商榷......

  2. 这可能是最难的解决方案。为ASP.NET Identity实现自己的提供程序。如果您为身份系统提供了执行某些操作的方法,那么它将起作用。然而,这是很多工作,无论如何你可能需要原始表格中的很多字段。以下是有关implementing providers的更多信息。我认为这不是一个很好的解决方案。如果您的用户数据存储空间不同,如果您只是不喜欢用户要求,那么这很好。此外,您还必须为许多您喜欢的支票编写代码。

  3. 不要使用ASP.NET标识。您可以使用较低级别的身份验证机制(实际上ASP.NET身份使用它)来创建安全的加密cookie并将您自己的查询写入数据库以确定用户是否应该成功登录。 Information on how to use OWIN authentication。在这种情况下,您可以实现您想要的任何逻辑,但您必须自己完成。没有为您执行检查,您必须确保正确散列密码,等等。您仍然可以使用Entity Framework对数据库执行这些查询。您可以像ASP.NET身份提供程序一样编写异步查询。 EF完全支持这一点。如果您不希望身份表进入您的数据库,这可能是您最好的选择。

  4. 遗憾的是,这些都不是完美而且容易适合您的情况。