2017-03-21 5 views
0

Je crée un modèle d'auto-référencement dans un modèle MVC5 qui est une réflexion après coup. Le modèle est comme ci-dessous:Auto-référencement MVC5 EF6 création d'un nouvel ID dans la base de données

public class GalleryCat 
    { 
    [Key] 
    public int GalleryCatId { get; set; } 
    public string CatName {get; set;} 
    public virtual GalleryCat GalleryCatParent { get; set; } 
    public int GalleryCatParentId {get; set; } 
    public virtual ICollection<GalleryCat> Children { get; set; } 
    public virtual ICollection<Gallery> Galleries { get; set; } 

    protected void OnModelCreating (DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<GalleryCat>() 
      .HasOptional(c => c.GalleryCatParent) 
      .WithMany(c => c.Children) 
      .HasForeignKey(p => p.GalleryCatParentId); 

     } 
} 

Cela crée un nouveau champ Id dans la base de données MYSQL comme GalleryCatParent_GalleryCatId au lieu de GalleryCatParentId? Quelqu'un peut-il guider ce que je fais à tort?

Répondre

0

OnModelCreating est une méthode de DbContext. Vous ne pouvez pas simplement l'ajouter à une classe d'entité. En d'autres termes, votre configuration courante n'est jamais exécutée, votre configuration n'est donc pas appliquée à la base de données.

Soit passer outre OnModelCreating dans votre contexte et ajoutez cette configuration couramment là, ou si vous voulez garder la config avec l'entité, vous pouvez le faire via:

public class GalleryCat 
{ 
    ... 

    public class Config : EntityTypeConfiguration<GalleryCat> 
    { 
     public Config() 
     { 
      HasOptional(c => c.GalleryCatParent) 
       .WithMany(c => c.Children) 
       .HasForeignKey(p => p.GalleryCatParentId); 
     } 
    } 
} 

Ensuite, passer outre OnModelCreating dans votre contexte comme si:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new GalleryCat.Config()); 
} 
+0

Merci quand j'implémentez cette reçois cette erreur .Migrations.ApplicationUserLogin:: EntityType « ApplicationUserLogin » n'a pas de clé définie. Définissez la clé pour cet EntityType. – Diin

+0

C'est un problème totalement indépendant. Pour cela, l'erreur est assez explicite: l'entité mentionnée n'a pas de clé définie. Basé sur le nom de la classe, vous avez probablement oublié d'hériter de IdentityUserLogin. –

+0

Si quelqu'un rencontre un problème similaire à celui que j'avais, ajoutez ceci (ou similaire) à votre override protégé par identityconfig protected OnModelCreating (DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add (nouveau GalleryCat.Config()); modelBuilder.Entity (). HasKey (l => l.UserId); modelBuilder.Entity (). HasKey (r => r.RoleId); modelBuilder.Entity (). HasKey (r => nouveau {r.RoleId, r.UserId}); } – Diin