web-dev-qa-db-fra.com

Utilisation d'Entity Framework 6 avec plusieurs schémas de base de données mais en utilisant un seul DBContext

J'ai une application utilisant EF comme ORM. La base de données avait un schéma, dbo et tout fonctionnait bien. J'ai récemment organisé mes tables en 4 schémas différents. Certaines tables d'un schéma ont des dépendances sur des tables qui résident sur un schéma différent. Tout semble valide du côté SQL.

Du côté de l'application, toutes les interactions db via EF ne fonctionnent plus. Le code se compile, les schémas sont visibles dans la solution, les mappages de modèles pointent vers les bons schémas, mais une fois que j'essaie d'insérer une ligne dans une table, cela ne fonctionne pas.

J'ai vu quelques articles sur l'utilisation de plusieurs schémas nécessitant l'utilisation de plusieurs DBContexts, mais je préfère utiliser un DBContext. Tous mes schémas ont le même propriétaire dbo et je ne vois aucune raison d'utiliser plusieurs DBContexts.

Est-ce que quelqu'un sait s'il existe un moyen d'y parvenir?

29
Apollonas

Vous pouvez mapper chaque table à son propre schéma uniquement par mappage fluide. Dans votre sous-type DbContext, vous devez remplacer OnModelCreating (si vous ne l'avez pas déjà fait) et ajouter des instructions comme ceci:

modelBuilder.Entity<Department>()  
    .ToTable("t_Department", "school");

Les entités que vous ne mappez pas explicitement comme cela seront placées dans le schéma dbo par défaut, ou vous pouvez fournir votre propre valeur par défaut en

modelBuilder.HasDefaultSchema("sales");

(résumé de ici )

30
Gert Arnold

En plus de la réponse de Gert Arnold, vous pouvez également utiliser l'attribut Table dans votre entité:

using System.ComponentModel.DataAnnotations.Schema;

[Table("t_Department", Schema = "school")]
public class Department
{
    public int Id { get; set; }

    public string Name { get; set; }
}
20
Stas Boyarincev

@GertArnold est sur place avec sa réponse. Cependant, pour les bonbons syntaxiques purs, vous pouvez également le faire via une convention pour extraire le schéma de l'espace de noms de vos modèles. Nous avons trouvé cela utile pour gérer plusieurs schémas

modelBuilder.Types().Configure(e => {
        var schema = e.ClrType.Namespace.Split('.').Last().ToLower();
        var name = entity.ClrType.Name;
        return entity.ToTable(name, schema);
});

ce qui précède prendra le dernier composant de l'espace de noms et l'utilisera comme nom de schéma. Cela évite d'avoir à personnaliser la liaison de table pour chaque entité.

8
Luke McGregor

ok, vous mettez le schéma o l'en-tête de classe, etc. mais où définissez-vous ce schéma? par exemple:

[Table("Test", Schema = "test1")]
public class Test
{
    public int Id { get; set; }
}

[Table("Test2", Schema = "test2")]
public class Test2
{
    public int Id { get; set; }
}

mais où mettre test1 et test2? différents DbContexts ou où?

0
Alex