我应该在免费声明之前说这是我对ASP.NET开发的新手并不是真正了解数据库上下文,尽管花了最后一小时阅读文档。当我构建我的ASP.NET MVC 5应用程序时,我选择了单独的用户帐户身份验证。 Visual Studio创建了一个名为IdentityModels.cs
的文件,并在其中定义了ApplicationUser
类和ApplicationDbContext
类。
我做了一些开发工作,我的CRUD控制器使用ApplicationDbContext
与数据库通信,方法是在每个控制器上都有这个私有属性:
private ApplicationDbContext db = new ApplicationDbContext();
在控制器操作中,我会执行以下操作:
return View(db.Trains.ToList());
我想整理这个数据库上下文,但我需要先了解它。我的主要问题是:
ApplicationDbContext
中定义的IdentityModels.cs
类替换为我自己的吗?ApplicationDbContext
类派生自IdentityDbContext<ApplicationUser>
,这是否意味着我应该为Visual Studio提供的用户身份验证提供单独的数据库上下文,以及我自己的代码?我认为我的最终目标是使用我自己的数据库上下文,称为DatabaseContext
,然后在我的所有控制器继承的基本控制器中使用。然后我只有一个地方实例化数据库上下文,而不是在每个控制器中。
谁知道,我可能在想这个错误的方法。似乎每个人都有自己喜欢的方式来解决这个问题。
谢谢!
答案 0 :(得分:8)
我可以在整个应用程序中使用一个数据库上下文,就像我现在正在做的那样吗?
ApplicationDbContext
是您的控制器的私有字段,并且创建和处理控制器每个请求 - ApplicationDbContext
将根据请求创建和处理。我可以用自己的吗?
替换IdentityModels.cs中定义的ApplicationDbContext类
UserStore
,它在构造函数中接收DbContext
作为参数,所以 var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(new CustomDbContext("connection")));
会奏效。您仍然必须确保ApplicationUser
是自定义上下文中的实体。当然,您也可以覆盖/替换ApplicationUser
。
ApplicationDbContext类派生自 IdentityDbContext,这是否意味着我应该拥有 为我提供的用户身份验证提供单独的数据库上下文 通过Visual Studio和我自己的代码?
默认情况下,Asp.Net Identity为您生成一个新的数据库,并ApplicationDbContext
配置为使用此数据库。您可以将您的身份验证相关实体存储在任何其他数据库中,您只需要确保所有相关表都在那里。您还可以扩展此数据库以包括您在应用程序中使用的其他表,以便您可以全部使用相同的上下文。
PS: ApplicationDbContext
不必实施IdentityDbContext<ApplicationUser>
,扩展默认DbContext
也有效(如果您已经生成了Db,那么必须更新它\使用代码迁移以使以下工作):
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
答案 1 :(得分:1)
我认为您希望为登录身份验证创建自己的自定义身份验证数据库。您需要一步一步地遵循给定的说明。 1)您需要创建自己的类来实现自定义身份验证。例如,我正在创建以下学生类。您可以在MVC的MODEL部分创建此类。
class student{
public int rollno{get;set;}
public string firstName{get;set;}
public string lastName{get;set;}
2)现在,您将使用identityDbContext为学生班级创建自己的dbcontext。你可以像这样在App_Start部分创建这个类。
public class ApplicationDbContext : IdentityDbContext<student>
{
public ApplicationDbContext() : base()
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
3)现在您可以在控制器中使用它,如下所示
public class HomeController : Controller
{
// GET: Home
public async Task<ActionResult> Index()
{
var context = new ApplicationDbContext(); // DefaultConnection
var store = new UserStore<student>(context);
var manager = new UserManager<student>(store);
var signInManager = new SignInManager<student, string>(manager,
HttpContext.GetOwinContext().Authentication);
var username = "Edward";
var email = "abc@gmail.com";
var password = "Your password";
var user = await manager.FindByEmailAsync(email);
if (user == null)
{
user = new student {
UserName = username,//username ,Email are getting from identityDbContext and the other three RollNO,FirstName and LastName are your own Custom members.so like this you can extend your any kind of data you like add or extend with IdentityDbContext.
Email = email,
RollNo = "15",
FirstName = "David",
LastName = "Kandel"
};
await manager.CreateAsync(user, password);
}
else
{
var result = await signInManager.PasswordSignInAsync(user.UserName, password, true, false);
if (result == SignInStatus.Success)
{
return Content("Hello, " +user.rollno + "" + user.FirstName + " " + user.LastName);
}
}
return Content("Hello, Index");
}
}