使用OnModelCreating与ApplicationDbContext解决'No key Defined'错误?

时间:2015-05-19 02:56:06

标签: c# asp.net-mvc-5 entity-framework-6 ef-model-builder

我一直在尝试为我的集合类型创建导航属性,并且我找到this example一个人如何使用OnModelCreating完成它。我在我的MVC 5应用程序中试了一下,在尝试更新我的数据库时收到了这个错误:

  

在模型生成期间检测到一个或多个验证错误:

     

BlogEngine.Models.IdentityUserLogin :: EntityType'IdentityUserLogin'   没有定义键。定义此EntityType的键。   BlogEngine.Models.IdentityUserRole :: EntityType'IdentityUserRole'   没有定义键。定义此EntityType的键。   IdentityUserLogins:EntityType:EntitySet'IdentityUserLogins'是   基于类型'IdentityUserLogin',没有定义键。   IdentityUserRoles:EntityType:EntitySet'IdentityUserRoles'基于   在类型'IdentityUserRole'上没有定义键。

如何解决这些'No key Defined'错误?

我做了一些搜索,我找到了this solution一个用户问题,但他的需求与我的不同。对于我想要做的事情,解决方案似乎很复杂。

这是导致问题的代码:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {

        }
        //public DbSet<Image> Images { get; set; }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }

        public DbSet<Post> Posts { get; set; }
        public DbSet<Image> Images { get; set; }
        public DbSet<Album> Albums { get; set; }
        public DbSet<Tag> Tags { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Post>().
                 HasOptional(e => e.Tags).
                 WithMany().
                 HasForeignKey(m => m.Tags_Id);

            modelBuilder.Entity<Tag>().
                 HasOptional(e => e.Posts).
                 WithMany().
                 HasForeignKey(m => m.Posts_Id);
        }

    }

以下是具有多对多关系的模型:

Post.cs model on Gist

Tag.cs model on Gist

更新以显示IdentityUser:

public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> 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;
        }
    }

3 个答案:

答案 0 :(得分:11)

您可能需要在OnModelCreating

中添加以下内容
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });

另见:

答案 1 :(得分:6)

我认为问题在于您已从perl bin/createsamples.pl positives.txt negatives.txt samples 7 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 1.1 -maxyangle 1.1 maxzangle 0.5 -maxidev 40 -w 80 -h 40" 删除了base类的调用。尝试添加,如下所示

OnModelCreating

答案 2 :(得分:1)

我知道这是一个迟到的回复,这可能只适用于教程或学校项目的人!

对我来说,只需删除数据库,.mdf和迁移文件夹就可以修复它。现在,我不知道你是否在使用迁移,但这对我有用。

我是一个新手,但我所注意到的是,身份对于钥匙非常挑剔。删除迁移有助于解决我的项目所遇到的每一个(被遗忘的)迁移问题。