Question

J'ai DbContext avec mis en place différents DbSet<T>s avec tous les types qui dérivent de la même classe de base:

public class Foo : Entity { }
public class Bar : Entity { }

MyDbContext : DbContext
{
  public DbSet<Foo> Foos { get; set; }
  public DbSet<Bar> Bars { get; set; }
}

Est-il possible d'obtenir toutes les entités qui ont la classe Entitybase dans une requête, comme:

DbContext.Set<Entity>();  // doesn't work

J'ai essayé d'introduire un DbSet<Entity> explicite au DbContext, mais que les résultats dans une grande table pour toutes les entités de la base de données.

Question supplémentaire: Si cela fonctionne en quelque sorte, que pour les interfaces sur l'interrogation

Modifier

J'ai suivi les instructions de Ladislav Mrnka lien et fait mes correspondances comme suit:

MyDbContext : DbContext
{
  public DbSet<Entity> Entities { get; set; }

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    // Foo
    modelBuilder.Entity<Foo>().Map(x =>
    {
      x.MapInheritedProperties();
      x.ToTable("Foo");
    })
    .HasMany(x => x.Tags).WithMany();

    modelBuilder.Entity<Foo>()
        .Property(x => x.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

    // Bar
    // same thing for Bar and a bunch of other Entities

    base.OnModelCreating(modelBuilder);
  }
}

Cela jette maintenant l'erreur

La propriété 'id' est pas une propriété déclarée sur le type 'Foo'. Vérifiez que la propriété n'a pas été explicitement exclue du modèle en utilisant la méthode Ignore ou annotation de données NotMappedAttribute. Assurez-vous qu'il est une propriété primitive valide.

J'ai aussi essayé de mettre la clé explicitement à la propriété Id:

modelBuilder.Entity<Foo>().Map(x => {...})
  .HasKey(x => x.Id)
  .HasMany(x => x.Tags).WithMany();

Qu'est-ce que je manque?

Était-ce utile?

La solution

Vous devez introduire héritage PTC . Après cela DbContext.Set<Entity>() fonctionnera et vous aurez toujours la table par entité.

Autres conseils

Juste à votre problème dans votre section Edition:

Le message d'erreur indique que vous avez la propriété clé Id dans votre Entity de classe de base. Ensuite, vous devez configurer la propriété clé de cette classe et non pas sur la classe dérivée Foo:

modelBuilder.Entity<Entity>()
    .Property(x => x.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top