实体框架 - 如何检查表是否存在?

0xb*_*00d 23 c# sql ef-code-first entity-framework-4.1

我正在使用实体框架和Code First方法.基类DbContext具有创建和删除数据库以及检查其存在的功能.

我想检查一个特殊的表(实体)是否存在.是否可以使用框架实现或者我是否需要编写自定义方法?如果我需要编写自己的实现,那么最通用的方法是什么?

谢谢你的帮助.

Lad*_*nka 33

如果需要检查表的存在,则必须调用自定义SQL代码:

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;
Run Code Online (Sandbox Code Playgroud)

表名默认定义为DbSet派生上下文中公开的名称,但默认名称可以通过流畅的API ToTable方法或Table数据注释覆盖.

以通用方式执行此操作不是代码优先方法中的假设.这将需要浏览元数据并手动探索实体映射到哪个表 - 这可能非常复杂,因为实体可以映射到多个表.代码优先不提供对元数据的访问.您必须转换DbContextObjectContext并浏览MetadataWorkspace.

编辑:

要转换DbContextObjectContext使用此:

ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
Run Code Online (Sandbox Code Playgroud)


Dmi*_*kiy 5

我无法在以前的帖子中添加评论。我正在使用 SQL Compact,但我不知道表的架构。我正在使用此代码来检查表它与上一篇文章中的非常相同,但它适用于任何表。

    /// <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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 捕获任何随机异常并不一定意味着该表不存在。 (5认同)
  • 此外,使用 Any 可以改进查询(如果存在) (2认同)