首页 文章

避免与Microsoft.AspNet.Identity 2.1.0和多个DbContexts重复的实体映射

提问于
浏览
1

我刚刚开始研究现有的代码库 . 它是一个带有WebAPI后端的AngularJS前端 . 它目前使用的是Microsoft.AspNet.Identity.EntityFramework 2.1.0和Microsoft.AspNet.Identity.Owin 2.1.0,代码优先是EntityFramework 6.1.1

我遇到的问题是代码库当前使用两个数据库上下文,这些上下文都映射到单个基础表 .

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

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

由于ASP.Net Identity.requirements,AccountUser must 派生自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表 .

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

理想情况下,我觉得我们应该只使用一个DbContext,因为它使用其中一个DbContexts纯粹是为了支持ASP.Net Identity . 但是我无法看到如何轻松重构,因为使用ASP.Net Identity从IdentityUser派生用户实体 must . 我们不能接受将从IdentityUser派生的实体传递到应用程序中的更高层,因为这会在这些更高层中引入对EntityFramework的依赖 .

我目前的感觉是ASP.Net Identity的使用导致了比解决问题更多的问题,并且我们最好实现自己的身份验证机制 .

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

我一直无法找到任何如何克服这个问题的例子 .

所以,问题是;有没有人成功地将ASP.Net Identity 2.1.0与EntityFramework 6.1.1一起使用,您可以同时满足使用从IdentityUser派生的类的ASP.Net Identity要求,并将用户实体传递到应用程序层而无需在那些更高层中引用EntityFramework .

提前感谢任何见解 .

1 回答

  • 0

    答案结果非常简单 . 虽然我们使用的是EntityFramework和Asp.Net Identity,但我们实际上并不想使用Microsoft.AspNet.Identity.EntityFramework .

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

相关问题