2011-05-23 87 views
19

我使用的是Code First方法的實體框架。基類DbContext具有創建和刪除數據庫以及檢查其存在的功能。實體框架 - 如何檢查表是否存在?

我想檢查一個特殊的表(實體)是否存在。使用框架實現可能嗎?還是需要編寫自定義方法?如果我需要編寫自己的實現,那麼最通用的方法是什麼?

感謝您的任何幫助。

回答

31

如果您需要檢查表的存在,你必須調用自定義的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; 

表名默認情況下爲DbSet暴露在你的派生上下文中的名字,但默認名可以被覆蓋定義通過流利的API的ToTable方法或Table數據註釋。

以通用的方式進行此操作並不是在代碼優先的方法中假設的。這將需要瀏覽元數據並手動探索映射到哪個表的實體 - 這可能非常複雜,因爲實體可以映射到多個表。代碼首先不提供對元數據的訪問。您必須將DbContext轉換爲ObjectContext並瀏覽MetadataWorkspace

編輯:

要轉換到DbContext使用ObjectContext此:

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

如何將DbContext轉換爲ObjectContext?我發現了不同的方法來檢查表的存在。你是否有任何區別a)SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA ='TheSchema'AND TABLE_NAME ='TheTable'))或b) SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo] 。[TableName]')AND鍵入(N'U')?你能解釋優點還是缺點?我寧願使用最標準的一致方式。 – 0xbadf00d 2011-05-23 18:25:20

+0

通常,所有這些SQL選擇查詢相同的信息 - 這是獲得相同結果的不同方式。 – 2011-05-23 18:29:22

+0

鍵入(N'U')是什麼意思?你的版本會忽略表格模式,對嗎? – 0xbadf00d 2011-05-23 18:32:44

2

的另一種方法;它不像Ladislav那樣高效,但它並不依賴於SQL Server:

bool CheckTableExists() 
{ 
    try 
    { 
     context.YourTable.Count(); 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 
+0

這是非常不推薦的性能明智的... – petric 2016-09-21 12:59:52

4

我無法在以前的帖子中添加評論。我正在使用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; 
     } 
    } 
1

假設:SQL服務器

查詢DbSet並不意味着表不存在時捕獲的任何舊的例外。

查詢DbSet,如果表不存在將會拋出一個EntityCommandExecutionException,其內部例外類型爲SqlException。該內部異常具有ErrorNumber屬性。

錯誤編號208讀取(source):

無效的對象名稱%1!'。

相關問題