我刚刚开始研究现有的代码库 . 它是一个带有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 回答
答案结果非常简单 . 虽然我们使用的是EntityFramework和Asp.Net Identity,但我们实际上并不想使用Microsoft.AspNet.Identity.EntityFramework .
我们需要做的只是使用Microsoft.AspNet.Identity并实现我们自己的用户和角色存储 .