【问题标题】:ASP.NET MVC5: Unable to add new roles with custom db contextASP.NET MVC5:无法使用自定义数据库上下文添加新角色
【发布时间】:2016-02-14 20:10:01
【问题描述】:

我的 ASP.NET MVC 项目的自定义数据库上下文存在一个非常令人作呕的问题。

我一直在尝试将自动生成的 ApplicationDbContext 与我自己的 GSDbContext 合并,同时仍然保持 IdentityUsersIdentityRoles 正常工作。

这是我自定义的ApplicationUser 类定义:

 public class ApplicationUser : IdentityUser
{
    [Required]
    public string FirstAndLastName { get; set; }

    public bool Active { get; set; }
}

和上下文类:

public class GSDbContext : IdentityDbContext
{
     public GSDbContext()
          : base("GSDbContext")
     {
     }

     public virtual IDbSet<ApplicationUser> Users { get; set; }
     public virtual IDbSet<IdentityRole> Roles { get; set; }
     public virtual IDbSet<IdentityUserLogin> UserLogins { get; set; }
     public virtual IDbSet<IdentityUserClaim> UserClaims { get; set; }
     public virtual IDbSet<IdentityUserRole> UserRoles { get; set; }
}

现在发生的情况是,当我尝试添加新角色时,我得到了System.ArgumentNullException。顺便说一句,我可以轻松地创建一个没有血腥痛苦的新用户。我使用此代码创建一个新用户:

var userManager = new UserManager<ApplicationUser>(
            new UserStore<ApplicationUser>(new GSDbContext()));
userManager.Create(user, password);

对于添加新角色:

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new GSDbContext()));
roleManager.Create(new IdentityRole("Admin"));

这会引发以下异常:

System.ArgumentNullException was unhandled by user code
  HResult=-2147467261
  Message=Value cannot be null.
Parameter name: source
  Source=System.Core
  ParamName=source
  StackTrace:
       at System.Linq.Queryable.Any[TSource](IQueryable`1 source, Expression`1 predicate)
       at Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext`1.ValidateEntity(DbEntityEntry entityEntry, IDictionary`2 items)
       at System.Data.Entity.DbContext.GetValidationErrors()
       at System.Data.Entity.Internal.InternalContext.SaveChangesAsync(CancellationToken cancellationToken)
       at System.Data.Entity.Internal.LazyInternalContext.SaveChangesAsync(CancellationToken cancellationToken)
       at System.Data.Entity.DbContext.SaveChangesAsync(CancellationToken cancellationToken)
       at System.Data.Entity.DbContext.SaveChangesAsync()
       at Microsoft.AspNet.Identity.EntityFramework.RoleStore`1.<CreateAsync>d__2.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
       at Microsoft.AspNet.Identity.RoleManager`1.<CreateAsync>d__0.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
       at Microsoft.AspNet.Identity.AsyncHelper.RunSync[TResult](Func`1 func)
       at Microsoft.AspNet.Identity.RoleManagerExtensions.Create[TRole](RoleManager`1 manager, TRole role)

这让我非常疯狂。

提前致谢。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-identity argumentnullexception


    【解决方案1】:

    您应该删除 IdentityDbContext 中已经存在的属性。

    public class GSDbContext : IdentityDbContext
    {
         public GSDbContext()
              : base("GSDbContext")
         {
         }
         public virtual IDbSet<ApplicationUser> Users { get; set; }
         //Nothing ELSE
    }
    

    【讨论】:

      【解决方案2】:

      不要将身份模型包含到您的 DbContext 中,因为 IdentityDbContext 本身已经包含了该模型。所以你可以像这样改变你的上下文:

      public class GSDbContext : IdentityDbContext<ApplicationUser>
      {
          // put your OTHER entities apart from identity related onces
          public IDbSet<MyModel> MyModels { get; set; }
          // and so on
      }
      

      【讨论】:

      • 谢谢,原来如此。虽然我在使用 UserManager 和我的上下文时遇到了多个 IEntityChangeTracker 问题,但我通过不使用它并使用直接 LINQ 来解决这个问题。
      • 发生这种情况是因为您同时有多个 DbContext 实例。如果您想使用相关代码提交有关该问题的问题并告诉我。我会回答的。
      • 不,我把它修好了。还是谢谢。
      猜你喜欢
      • 1970-01-01
      • 2021-10-12
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多