gpt4 book ai didi

c# - 为什么 Asp.Net Identity IdentityDbContext 是黑盒?

转载 作者:IT王子 更新时间:2023-10-29 04:05:02 25 4
gpt4 key购买 nike

IdentityDbContext 似乎存在很多混淆。

如果我们在我们的应用程序中创建两个数据库上下文,一个用于身份,一个用于我们的自定义业务数据,身份数据库上下文继承自 IdentityDbContext,而我们的自定义业务数据继承自 DbContext.

所以让我们将以下内容添加到 Controller 中:

private MyDbContext db = new MyDbContext();
private ApplicationDbContext identityDb = new ApplicationDbContext();

Controller 中的 Index 方法如下:

var thingsInMyBusinessDb = db.Things.ToList();
var usersInIndentityDb = identityDb.AspNetUsers.ToList(); // THIS WILL HAVE AN ERROR
var roles = identityDb.AspNetRoles.ToList(); // ERROR

您还会注意到身份数据库中的表不可用。 这是为什么?

目前从 2.0.0-beta1 开始有一个用户和角色项目,但我希望实际的表可用。 为什么不呢?如果我想进入 AspNetUserRoles 怎么办

如果像 Entity Framework 中的任何数据库上下文一样对待它,那么 Asp.Net Identity 的许多困惑和问题似乎都会消失。

最佳答案

ApplicationDbContextUsersRoles 属性映射到AspNetUsersAspNetRoles 表和其余实体(ClaimsLoginsUserRoles)通过导航属性自动映射。据我所知,ApplicationDbContext 中只有表名前缀为“AspNet”的自定义映射,其他一切都只是 Entity Framework Code First 约定。

如果您需要通过 ApplicationDbContext 直接访问表,您可以这样做...

using (var context = new ApplicationDbContext())
{
var users = context.Users.Include(u => u.Claims)
.Include(u => u.Logins)
.Include(u => u.Roles)
.ToList();

var roles = context.Roles.ToList();
}

您可以通过 IdentityUser 实体(来自 Users DbSet)的导航属性访问用户的角色、声明和登录。如果您想直接查询它们,请将它们显式添加为上下文中的 DbSet...

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}

public DbSet<IdentityUserRole> UserRoles { get; set; }
public DbSet<IdentityUserClaim> Claims { get; set; }
public DbSet<IdentityUserLogin> Logins { get; set; }

}

然后像这样查询它们...

var claims = context.Claims.ToList();
var userRoles = context.UserRoles.ToList();
var logins = context.Logins.ToList();

ASP.NET Identity 2.0 为方便起见在 Manager 类上公开了 UsersRoles IQueryable,但它不提供任何添加的功能优于 DbContext 提供的功能。

关于c# - 为什么 Asp.Net Identity IdentityDbContext 是黑盒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22105583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com