扩展MVC6中的Identity3

时间:2015-12-22 14:24:16

标签: asp.net asp.net-mvc asp.net-identity asp.net-core asp.net-core-mvc

使用asp.net5的最新(当前)RC1我正在寻找在用户实体和 WorkLog 实体之间建立简单关系。

是否可以使用Identity中的ApplicationUser类作为起点并使用定义为链接键的ApplicationUser键?我在过去扩展ApplicationUser时遇到了问题,因此生成了一个单独的dbcontext(指向同一个数据库)并创建了我自己的管道,以便将IdentityUsers Id传递给我的单独dbcontext。有没有人有任何扩展IdentityDbContext添加外键表映射到IdentityUser类的示例?

以下示例

//DBContext
     public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
        {
            public DbSet<WorkLogItem> WorkLogItems { get; set; }
            protected override void OnModelCreating(ModelBuilder builder)
            {
                base.OnModelCreating(builder);
                // Customize the ASP.NET Identity model and override the defaults if needed.
                // For example, you can rename the ASP.NET Identity table names and more.
                // Add your customizations after calling base.OnModelCreating(builder);
                builder.Entity<WorkLogItem>(
                    e =>
                    {
                        e.Property(p => p.id).IsRequired().UseSqlServerIdentityColumn();
                    });
            }
        }
//WorkLogItem
    public class WorkLogItem
    {
        public int id { get; set;}
        public String UserId { get; set; }
        public int Hours { get; set; }
        public String Description { get; set; }
    }
//ApplicationUser
    public class ApplicationUser : IdentityUser
    {
        public ICollection<WorkLogItem> WorkLogItems { get; set; }
    }

1 个答案:

答案 0 :(得分:2)

执行您所要求的内容预计会开箱即用。您可以查看this commit以查看新创建的带有Identity的MVC 6项目与上面的架构之间的区别。

注册用户并刷新/ Home / Index会导致WorkLogItem按预期添加。请注意,您不需要单独的数据库上下文。

public IActionResult Index()
{
    var user = _db.Users.Include(p => p.WorkLogItems).FirstOrDefault();
    if (user != null)
    {
        user.WorkLogItems.Add(new WorkLogItem { Description = "New item added" });
        _db.SaveChanges();
        ViewBag.WorkItems = user.WorkLogItems.ToList();
    }
    else ViewBag.WorkItems = new WorkLogItem[] { };

    return View();
}

将任何集合添加到现有实体时要注意的关键项是:

  1. 确保添加迁移并更新数据库
  2. 请确保您在查询中使用Include,因为EF7 does not support Lazy Loading