J'ai créé une classe dans MVC5, où je veux un propriétaire principal du contenu et ensuite je veux avoir des éditeurs pour le contenu:
public class Content
{
public int ID { get; set; }
public IdentityUser Owner { get; set; }
public ICollection<IdentityUser> Editors { get; set; }
public string Title{ get; set; }
public string Body { get; set; }
}
Dans le contexte de la base de données, j'ai le code suivant:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Content>()
.HasOptional(c => c.Editors)
.WithRequired()
.WillCascadeOnDelete();
modelBuilder.Entity<Content>()
.HasRequired(c => c.Owner)
.WithOptional()
.WillCascadeOnDelete();
}
Je m'attendrais à ce que Microsoft ait implémenté l'objet IdentityUser
de telle manière qu'il puisse être utilisé dans d'autres types d'entités, donc je fais probablement quelque chose de mal, car lorsque j'essaie de créer un contrôleur pour l'entité Content tapez, j'obtiens l'erreur suivante:
EntityType 'IdentityUserLogin' has no key defined
EntityType 'IdentityUserRole' has no key defined
EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no key defined
EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no key defined
J'ai également essayé d'ajouter le code suivant au ApplicationDbContext
comme décrit dans cette question Mapper les tables en utilisant l'api couramment dans asp.net MVC5 EF6? :
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
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 });
}
Je dois faire quelque chose de mal. Veuillez me dire comment je peux gérer les utilisateurs dans mon Content EntityType.
La méthode suivante, OnModelCreating
, créera un contexte de travail. Je ne sais pas si c'est le mappage que vous souhaitez.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Content>()
.HasMany(c => c.Editors)
.WithOptional()
.WillCascadeOnDelete(false);
modelBuilder.Entity<Content>()
.HasRequired(c => c.Owner)
.WithOptional()
.WillCascadeOnDelete(false);
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 });
}
J'ai eu le même problème et j'ai trouvé que je n'avais pas appelé
base.OnModelCreating(modelBuilder);
dans mon DbModel