entity framework – 如何检查表是否存在?

我正在使用entity framework和Code First方法。 基类DbContext具有创建和删除数据库以及检查其存在的function。

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

谢谢你的帮助。

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

bool exists = context.Database .SqlQuery(@" 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; 

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

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

编辑:

要将DbContext转换为ObjectContext使用以下命令:

 ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext; 

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

  ///  /// Check if data table is exist in application ///  /// Class of data table to check /// DB Object public static bool CheckTableExists(this ModelLocker db) where T : class { try { db.Set().Count(); return true; } catch (Exception) { return false; } } 

假设:SQL Server

查询DbSet时捕获任何旧exception并不意味着该表不存在。

查询表不存在的DbSet将抛出EntityCommandExecutionException ,其内部exception类型为SqlException 。 该内部exception具有ErrorNumber属性。

错误号208读取( 来源 ):

无效的对象名称’%。* ls’。

另一种方法; 它不像Ladislav那样高效,但它不依赖于SQL Server(编辑为添加Where子句来解决性能问题):

 bool CheckTableExists() { try { context.YourTable.Where(s => s. = ).Count(); return true; } catch (Exception) { return false; } } 

我认为以下代码更容易理解。

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