将MyDbContext与IdentityDbContext合并

mar*_*onx 52 asp.net-mvc asp.net-identity

我在一个单独的Data Accass Layer类库项目中有一个MyDbContext.我有一个带有默认IdentityDbContext的ASP.NET MVC 5项目.这两个上下文使用相同的数据库,我想将AspNetUsers表用于我的表的外键.所以我想合并两个Context,我也想使用ASP.NET Identity.

我怎样才能做到这一点?

请指教,

合并后这是我的上下文:

public class CrmContext : IdentityDbContext<CrmContext.ApplicationUser> //DbContext
{
    public class ApplicationUser : IdentityUser
    {
        public Int16 Area { get; set; }
        public bool Holiday { get; set; }
        public bool CanBePublic { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public CrmContext()
        : base("DefaultConnection")
    {

    }

    public DbSet<Case> Case { get; set; }
    public DbSet<CaseLog> CaseLog { get; set; }
    public DbSet<Comment> Comment { get; set; }
    public DbSet<Parameter> Parameter { get; set; }
    public DbSet<Sign> Sign { get; set; }
    public DbSet<Template> Template { get; set; }
    public DbSet<Read> Read { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的RepositoryBase类:

    public class RepositoryBase<TContext, TEntity> : IRepositoryBaseAsync<TEntity>, IDisposable
        where TContext : IdentityDbContext<CrmContext.ApplicationUser> //DbContext
        where TEntity : class
    {
        private readonly TContext _context;
        private readonly IObjectSet<TEntity> _objectSet;

        protected TContext Context
        {
            get { return _context; }
        }

        public RepositoryBase(TContext context)
        {
            if (context != null)
            {
                _context = context;
                //Here it is the error:
                _objectSet = (_context as IObjectContextAdapter).ObjectContext.CreateObjectSet<TEntity>();
             }
             else
             {
                 throw new NullReferenceException("Context cannot be null");
             }
         }
     }
Run Code Online (Sandbox Code Playgroud)

'System.Data.Entity.ModelConfiguration.ModelValidationException'EntityFramework.dll中出现类型异常,但未在用户代码中处理

附加信息:在模型生成期间检测到一个或多个验证错误:

更新:我找到了解决方案.

我不得不删除这个命名约定:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Run Code Online (Sandbox Code Playgroud)

并将ef cf模型迁移到db,使用asp.net标识的命名约定重命名我的表.它现在正在运作!

jd4*_*d4u 32

  1. ApplicationUser定义移动到DAL.
  2. 继承你MyDbContextIdentityDbContext<ApplicationUser>IdentityDbContext
  3. OnModelCreating - 提供外键信息.
  4. 通过MyDbContext在创建UserManager<ApplicationUser>

  • 我尝试了这个,它似乎工作,但当我尝试进行EF CF迁移时,由于缺少外键,迁移失败. (2认同)
  • 如果我从IdentityDbContext继承MyDbContext,则没有SaveChanges方法 (2认同)

dot*_*gis 6

如果您按照上述步骤操作但无法确定如何提供密钥信息,则可能会收到以下消息.您可能收到的错误是:

IdentityUserLogin :: EntityType'IdentityUserLogin'没有定义键.定义此EntityType的键.Context.IdentityUserRole :: EntityType'IdentityUserRole'没有定义键.定义此EntityType的键.

创建以下两个类

public class IdentityUserLoginConfiguration : EntityTypeConfiguration<IdentityUserLogin>
{

    public IdentityUserLoginConfiguration()
    {
        HasKey(iul => iul.UserId);
    }

}

public class IdentityUserRoleConfiguration : EntityTypeConfiguration<IdentityUserRole>
{

    public IdentityUserRoleConfiguration()
    {
        HasKey(iur => iur.RoleId);
    }

}
Run Code Online (Sandbox Code Playgroud)

在Applications DbContext中的OnModelCreating方法中,将上面概述的两个配置添加到模型中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Configurations.Add(new IdentityUserLoginConfiguration());
        modelBuilder.Configurations.Add(new IdentityUserRoleConfiguration());

    }
Run Code Online (Sandbox Code Playgroud)

现在,这应该在创建模型时摆脱错误方法.它对我有用.


tom*_*dox 5

值得注意的是,如果合并DBContexts,则将身份验证方法(在这种情况下为ASP的Identity)绑定到数据访问实现(EF)。从代码设计的角度来看,这可以看作是您的担忧和对单一职责原则的违反。

在大多数情况下,这可能很好,但是如果您想在其他非Web应用程序中重用数据层(例如,对于台式机或服务器应用程序),则会出现问题,因为IdentityDbContext位于Microsoft.AspNet.Identity.EntityFramework中名称空间以及您的桌面或服务器应用程序不太可能使用AspNet Identity作为其身份验证机制。

在这种情况下,最终保留了ASP的第二个数据库上下文,该上下文保留在Web项目中。然后,当用户登录时,我们将有关用户的一些数据(名字,姓氏等)交叉加载到Identity的Claims对象中。