在 MVC6 中扩展 Identity3

Posted

技术标签:

【中文标题】在 MVC6 中扩展 Identity3【英文标题】:Extending Identity3 in MVC6 【发布时间】:2016-03-28 20:18:50 【问题描述】:

使用 asp.net5 的最新(当前)RC1,我正在研究在 User 实体和 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】:

按照您的要求去做应该是开箱即用的。您可以查看 this commit 以了解新创建的具有 Identity 的 MVC 6 项目与上述架构之间的区别。

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

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();

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

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

【讨论】:

很好的帮助,当我浏览那个 repo 时真的很有帮助。

以上是关于在 MVC6 中扩展 Identity3的主要内容,如果未能解决你的问题,请参考以下文章

MVC6 Cors - 拦截预检

在 ASP.NET MVC6 中访问查询字符串

CORS 不起作用 MVC6 - RC1

IIS 拦截预检 MVC6

启动后更改MVC6的路由集合

如何配置 MVC6 应用程序以在 IIS 上运行?