web-dev-qa-db-fra.com

Utilisateur dans le type d'entité MVC5 EF6

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.

49
Gunnar

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 });
}
61
Olav Nybø

J'ai eu le même problème et j'ai trouvé que je n'avais pas appelé

 base.OnModelCreating(modelBuilder);

dans mon DbModel

104
Aaron