我正在尝试将Asp.Net Identity生成的表中的用户与我自己的表建立关系。这种关系必须是多对多的,因为许多用户可以处理同一个任务(这是我的表),同时用户可以处理多个任务。
public class Task
{
public int ID { get; set; }
public string Name { get; set; }
public string UserID { get; set; }
public virtual ICollection<ApplicationUser> Users { get; set; }
}
public class ApplicationUser : IdentityUser
{
public int TaskID { get; set; }
public virtual ICollection<Task> Tasks{ get; set; }
// rest of the code
}
我尝试这种方式,但在迁移(或运行时)期间出现错误
请帮我解决这个问题并存档我需要的内容。
答案 0 :(得分:4)
试试这样:
public class Projects
{
public Projects()
{
ApplicationUser = new HashSet<ApplicationUser>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ApplicationUser> ApplicationUser { get; set; }
}
申请用户
public class ApplicationUser : IdentityUser
{
public ApplicationUser()
{
Projects = new HashSet<Projects>();
}
public async Task GenerateUserIdentityAsync(UserManager manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
public virtual ICollection <Projects > Projects { get; set; }
}
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public virtual DbSet<Projects> Projects { get; set; }
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
现在当我运行这个Mvc应用程序并注册时,我得到的数据库表如下:
和正确的架构:
需要质疑的事情很多,从我的观点来看,重要的是确定你是否: - 可以/应该混合应用程序上下文和模型上下文吗?
答案 1 :(得分:1)
您可以使用Fluent API
尝试如下所示。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Task>()
.HasMany<ApplicationUser>(s => s.Users)
.WithMany(c => c.Tasks)
.Map(cs =>
{
cs.MapLeftKey("TaskRefId");
cs.MapRightKey("ApplicationUserRefId");
cs.ToTable("TaskApplicationUser");
});
}
更新:您也可以看到此链接。
EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType
答案 2 :(得分:1)
错误文字与您的多对多关系无关。它提示其他内置实体未正确配置。因此,如果您提供了自定义DbContext类的完整定义及其配置方式,那就太好了。
<强>更新强>
据我所知,你正在处理两种不同的情况。您必须使用相同的上下文,因为您正在扩展IdentityContext,创建关系和添加自定义类型。那么问题就会自行解决。 希望,这会有所帮助。