Entity Framework - Comment vérifier si la table existe?

j'utilise le Framework Entity avec Code First approach. La classe de base DbContext a des fonctions pour créer et supprimer la base de données ainsi que pour vérifier son existence.

je veux vérifier si une table spéciale (entité) ou pas. Est-ce possible avec une implémentation de framework ou dois-je écrire des méthodes personnalisées? Si je dois rédiger ma propre mise en œuvre, quelle serait l'approche la plus générique pour le faire?

merci de votre aide.

20
demandé sur Ladislav Mrnka 2011-05-23 21:56:06

5 réponses

si vous avez besoin de vérifier l'existence de la table, vous devez appeler le code SQL personnalisé:

bool exists = context.Database
                     .SqlQuery<int?>(@"
                         SELECT 1 FROM sys.tables AS T
                         INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id
                         WHERE S.Name = 'SchemaName' AND T.Name = 'TableName'")
                     .SingleOrDefault() != null;

le nom de la Table est défini par défaut comme le nom de DbSet exposé sur votre contexte dérivé mais le nom par défaut peut être modifié par ToTable méthode ou Table annotation des données.

faire cela de manière générique n'est pas quelque chose de supposé dans la première approche de code. Cela nécessitera la navigation des métadonnées et explorer manuellement à quelle table est l'entité mapped - cela peut être assez complexe parce que l'entité peut être mappée à plusieurs tables. Le Code first n'offre pas l'accès aux métadonnées. Vous devez convertir DbContextObjectContext et parcourir MetadataWorkspace.

Edit:

Pour convertir DbContextObjectContext utilisation:

ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
32
répondu Ladislav Mrnka 2011-05-23 18:37:04

je ne peux pas ajouter de commentaire pour le post précédent. J'utilise SQL Compact et je ne connais pas le schéma de la table. J'utilise ce code pour vérifier la table il est assez le même que dans le post précédent, mais il fonctionne pour n'importe quelle table.

    /// <summary>
    /// Check if data table is exist in application
    /// </summary>
    /// <typeparam name="T">Class of data table to check</typeparam>
    /// <param name="db">DB Object</param>
    public static bool CheckTableExists<T>(this ModelLocker db) where T : class
    {
        try
        {
            db.Set<T>().Count();
            return true;

        }
        catch (Exception)
        {
            return false;
        }
    }
3
répondu Dmitriy Polyanskiy 2016-02-16 08:35:52

une méthode alternative; elle n'est pas aussi efficace que celle de Ladislav, mais elle n'est pas liée à SQL Server:

bool CheckTableExists()
{
    try
    {
        context.YourTable.Count();
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}
2
répondu philu 2015-03-20 05:42:15

Assomption: SQL Server

attraper n'importe quelle vieille exception quand on interroge le DbSet ne signifie pas que la table n'existe pas.

Interrogation d'un DbSet où la table n'existe pas va jeter un EntityCommandExecutionException avec une exception interne de type SqlException. Cette exception intérieure a un ErrorNumber propriété.

numéro d'Erreur 208 lit ( source):

nom de l'objet invalide'%.* ls'.

2
répondu Aaron Hudon 2017-01-27 17:34:41

je pense que suivre le code est un peu plus compréhensible.

using(YourDbEntities db = new YourDbEntities()) 
{
  bool IsExists = db.Database
   .SqlQuery <int?> (@"
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = '" + yourTableName + "'
    ")
    .FirstOrDefault() > 0;

    return IsExists;
}
1
répondu Ali Soltani 2018-08-25 09:08:39