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

时间:2015-06-06 02:06:17

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

我尝试执行以下操作...当user提交新的article时,我想在我的网络应用程序中显示作者(用户)用户名。这就是为什么我需要"连接"这两个,我想只有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();
    }
}

但我不确定这是否是正确的方法。该如何正确完成?

更新(我对DavidG的回答的解释&#39>

首先,我正在检索这样的用户列表:

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();
        }
    }
}

问题在于,由于这个错误,我无法获得UserName或任何其他属性。我在线观看了一些教程,没有人提到过DbSet是用户。无论如何......现在我知道为什么我不需要这个属性:

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

来自VS的这条消息帮助了我(打算让其他人偶然遇到同样的问题):

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您的应用程序只需要继承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();
    }

}