Asp.Net MVC 5中包含身份表和自定义表

时间:2016-09-24 12:16:31

标签: entity-framework asp.net-mvc-5 ef-code-first foreign-keys entity-framework-6

我正在尝试将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
}

我尝试这种方式,但在迁移(或运行时)期间出现错误

“在模型生成期间检测到一个或多个验证错误:” enter image description here

请帮我解决这个问题并存档我需要的内容。

3 个答案:

答案 0 :(得分:4)

试试这样:

  1. 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;     }
    }
    
  2. 申请用户

  3. 
    
        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; }
        }
    
    
    1. 应用程序上下文:
    2. 
      
          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应用程序并注册时,我得到的数据库表如下:

      From MSSQL

      和正确的架构:

      enter image description here

      需要质疑的事情很多,从我的观点来看,重要的是确定你是否:   - 可以/应该混合应用程序上下文和模型上下文吗?

答案 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,创建关系和添加自定义类型。那么问题就会自行解决。 希望,这会有所帮助。