【问题标题】:ASP.NET add list to ApplicationUserASP.NET 将列表添加到 ApplicationUser
【发布时间】:2016-03-20 22:36:53
【问题描述】:

我想将MyActivity 对象列表添加到ASP.NET webforms 应用程序中创建的标准ApplicationUser 对象:

public class ApplicationUser : IdentityUser
{
    public ICollection<MyActivity> Activities { get; set; } // Added that

    public ClaimsIdentity GenerateUserIdentity(ApplicationUserManager manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = manager.CreateIdentity(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }

    public Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
    {
        return Task.FromResult(GenerateUserIdentity(manager));
    }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

我将 MyActivity 类定义为:

public class MyActivity
{
    public Guid Id { get; set; }
    public ApplicationUser User { get; set; }
    public string SomeProp { get; set; }
}

然后我执行了“add-migration UserActivities”和“update-database”。我创建了一个 MyActivities 表,其中包含一个 User_Id 外键,引用 AspNetUsers.Id。 一切都好。

但是现在,当我尝试添加一个活动时:

using (var db = new ApplicationDbContext())
{
    var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
    var currentUser = manager.FindById(User.Identity.GetUserId());
    currentUser.Activities.Add(new MyActivity { SomeProp = "1" });
    db.SaveChanges();
}

我得到一个NullReferenceExceptioncurrentUser.Activities 为空)。

怎么了?

【问题讨论】:

    标签: c# asp.net ef-code-first entity-framework-6


    【解决方案1】:

    FindById 默认不会返回您的自定义子集合。您可以直接访问用户表:

    var currentUser = db.Users.Include(u => u.Activities).First(u => u.Id == manager.FindById(User.Identity.GetUserId());
    

    更好的方法是实现您自己的 UserStore 来覆盖 FindById,类似于:Custom entities with asp net identity (one-to-many)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多