我使用的是Code First方法的實體框架。基類DbContext具有創建和刪除數據庫以及檢查其存在的功能。實體框架 - 如何檢查表是否存在?
我想檢查一個特殊的表(實體)是否存在。使用框架實現可能嗎?還是需要編寫自定義方法?如果我需要編寫自己的實現,那麼最通用的方法是什麼?
感謝您的任何幫助。
我使用的是Code First方法的實體框架。基類DbContext具有創建和刪除數據庫以及檢查其存在的功能。實體框架 - 如何檢查表是否存在?
我想檢查一個特殊的表(實體)是否存在。使用框架實現可能嗎?還是需要編寫自定義方法?如果我需要編寫自己的實現,那麼最通用的方法是什麼?
感謝您的任何幫助。
如果您需要檢查表的存在,你必須調用自定義的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;
的另一種方法;它不像Ladislav那樣高效,但它並不依賴於SQL Server:
bool CheckTableExists()
{
try
{
context.YourTable.Count();
return true;
}
catch (Exception)
{
return false;
}
}
這是非常不推薦的性能明智的... – petric 2016-09-21 12:59:52
我無法在以前的帖子中添加評論。我正在使用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;
}
}
假設:SQL服務器
查詢DbSet
並不意味着表不存在時捕獲的任何舊的例外。
查詢DbSet
,如果表不存在將會拋出一個EntityCommandExecutionException
,其內部例外類型爲SqlException
。該內部異常具有ErrorNumber
屬性。
錯誤編號208讀取(source):
無效的對象名稱%1!'。
如何將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
通常,所有這些SQL選擇查詢相同的信息 - 這是獲得相同結果的不同方式。 – 2011-05-23 18:29:22
鍵入(N'U')是什麼意思?你的版本會忽略表格模式,對嗎? – 0xbadf00d 2011-05-23 18:32:44