如何正确地合并ApplicationDbContext与您的自定义DbContext

本文关键字:自定义 DbContext ApplicationDbContext 正确地 合并 | 更新日期: 2023-09-27 17:54:08

我想做以下事情…当user提交一个新的article时,我想在我的web应用程序中显示作者(用户)的用户名。这就是为什么我需要"连接"这两个,我想只有1 DbContext。

现在我这样做:

public class ApplicationDbContext : IdentityDbContext
{
    public DbSet<ApplicationUser> ApplicationUsers { get; set; }
    private DbSet<Article> Articles { get; set; } // This line is all i have added/changed. Everything else was auto-generated when i created a new ASP.net MVC project with individual authentication in visual studio.
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

但我不确定这是不是正确的方法。如何正确地做到这一点呢?

UPDATE(解释我对DavidG的回答的评论)

首先我像这样检索用户列表:

class ApplicationUserService
{
    public List<ApplicationUser> GetUsers()
    {
        using (var dbContext = new ApplicationDbContext())
        {
            return dbContext.ApplicationUsers.ToList();
        }
    }
}

代替:

class ApplicationUserService
{
    public List<IdentityUser> GetUsers()
    {
        using (var dbContext = new ApplicationDbContext())
        {
            return dbContext.Users.ToList();
        }
    }
}

问题是,我不能得到用户名或任何其他属性,因为这个错误。我在网上看了一些教程,没有人提到DbSet是Users。不管怎样…现在我知道为什么我不需要这个属性了:

public DbSet<ApplicationUser> ApplicationUsers { get; set; }

来自VS的这条消息帮助了我(旨在帮助其他可能遇到同样问题的人):

'ApplicationDbContext.Users' hides inherited member 'IdentityDbContext<IdentityUser, IdentityRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>.Users'.

如何正确地合并ApplicationDbContext与您的自定义DbContext

如果您想使用一个上下文,并且Identity表与"article"表位于同一数据库中,则可以这样做。我通常喜欢重写OnModelCreating,这样我就可以为我创建的表添加映射/配置。

根据应用程序的大小,我保留Identity上下文,并为我的应用程序创建一个(我可能包括Users表,以便更容易检索用户)。

您的应用程序只需要从IdentityDbContext类的正确版本继承。您需要使用通用类,这样您就可以使用自己的IdentityUser定制用户类。所以你的语境应该是这样的。注意新的继承和删除了ApplicationUsers属性。这被删除,因为Identity类已经为您完成了。

public class ApplicationDbContext : IdentityDbContext<IdentityUser>
{
    private DbSet<Article> Articles { get; set; }
    public ApplicationDbContext()
    : base("DefaultConnection")
    {
    }
    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}