使用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; }
}
按照你的要求去做是可以开箱即用的。您可以查看此提交,以了解新创建的带有Identity的MVC 6项目与上面的模式之间的区别。
注册用户并刷新/Home/Index会导致按预期添加WorkLogItem
。请注意,您不需要单独的DB上下文。
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不支持延迟加载