使用Microsoft.AspNet.Identity 2.1.0和多个DbContext避免重复的实体映射

本文关键字:DbContext 映射 实体 Identity AspNet Microsoft 使用 | 更新日期: 2023-09-27 18:26:46

我刚刚开始处理现有的代码库。它是一个带有WebAPI后端的AngularJS前端。它目前正在使用Microsoft.AspNet.Identity.EntityFramework 2.1.0和Microsoft.AspNet.Identity.Owin 2.1.0,代码第一个EntityFramework 6.1.1

我遇到的问题是,代码库当前使用两个数据库上下文,而这些上下文都映射到一个底层表。

第一个dbcontext仅用于以支持ASP.Net Identity;

public class AccountSecurityDBContext : IdentityDbContext<AccountUser, AccountRole, Guid, AccountUserLogin, AccountUserRole, AccountUserClaim>
{
   ...
   modelBuilder.Entity<AccountUser>().ToTable("User");
   ...
}

其中,由于ASP.Net Identity.rerequirements,AccountUser必须从IdentityUser派生;

public class AccountUser : IdentityUser<Guid, AccountUserLogin, AccountUserRole, AccountUserClaim>
{
   ...
}

这个AccountUser类纯粹用于满足ASP.Net标识。第二个DbContext有另一个到User表的映射,用于除身份验证之外的所有操作。

public class MainContextUnitOfWork : DbContext
{
   ...
   modelBuilder.Entity<User>().ToTable("User");
   ...
}

因此,目前有两个类,AccountUser和User,都映射到同一个底层User表。

使用两个DbContext,每个DbContext都有自己到同一底层表的映射,这会导致问题。EntityFramework希望创建两个迁移,每个DbContext一个,从而生成重复的迁移。我知道add migration--ignore选项,这样我们就可以为第二个DbContext生成一个空的迁移,而这个空的迁移将在空的迁移的designer.cs文件中生成数据模型的新散列。

理想情况下,我觉得我们真的应该只使用一个DbContext,因为有两个DbContext相当令人困惑,而我们使用其中一个DbContext纯粹是为了支持ASP.Net Identity。然而,由于要使用ASP.Net Identity,用户实体必须从IdentityUser派生,因此我看不出如何轻松重构。我们不接受将从IdentityUser派生的实体传递到应用程序中的更高层,因为这会在这些更高层中引入对EntityFramework的依赖。

我目前的感觉是,使用ASP.Net Identity造成的问题比解决的问题多,我们最好实现自己的身份验证机制。

重申。问题在于ASP.Net Identity强制从IdentityUser继承,而不允许(例如)基于(不存在的)IIdentityUser接口的实现。

我一直找不到任何克服这一问题的例子。

所以,问题是;是否有人成功地将ASP.Net Identity 2.1.0与EntityFramework 6.1.1一起使用?在EntityFramework 6.1.1中,您既能够满足使用从IdentityUser派生的类的ASP.Net Identity要求,又能够将User实体传递到应用程序层,而无需在更高的层中引用EntityFramework。

提前感谢您的任何见解。

使用Microsoft.AspNet.Identity 2.1.0和多个DbContext避免重复的实体映射

答案很简单。尽管我们使用的是EntityFramework和Asp.Net Identity,但实际上我们并不想使用Microsoft.AspNet.Identity.EntityFramework.

我们需要做的只是使用Microsoft.AspNet.Identity并实现我们自己的用户和角色存储。