[英]Check if a table exists within a database using LINQ
我們有一個已部署到各種客戶端的數據庫。 我們目前正在引入一個可選的新功能,該功能將要求希望該功能的客戶將新表添加到現有數據庫中。
正在我們推出一款新軟件,無論是否有新表,都必須與數據庫版本進行交互(因為我們不希望有2個版本用於擁有新表的客戶和一個用於不是)我們想知道是否有可能以編程方式確定(使用實體框架)數據庫中是否存在表(我可以嘗試訪問該表並讓它拋出異常但是想知道是否有內置函數去做這個)
謝謝
編輯:鑒於人們告訴我我應該使用配置文件不檢查EF,任何人都可以指導我如何檢查配置文件,例如,mvc控制器的自定義數據注釋。 就像是:
[Boolean(Properties.Settings.Default.TableExists)]
public class NamedController : Controller
如果錯誤,會拋出未找到的頁面?
編輯2:根據人們給出的建議使用配置設置,我最終得到了以下解決方案
用於設置表是否存在的應用程序設置
<appSettings>
<add key="tableExists" value="True"/>
</appSettings>
自定義數據注釋,以說明是否允許訪問控制器
[AuthoriseIfTableExistsIsTrue]
public class NamedController : Controller
自定義授權的代碼
public class AuthoriseIfTableExistsIsTrue : AuthorizeAttribute
{
private readonly bool _tableExists;
public AuthoriseIfTableExistsIsTrue()
{
_tableExists = string.Equals(bool.TrueString, ConfigurationManager.AppSettings["tableExists"], StringComparison.InvariantCultureIgnoreCase);
}
public AuthoriseIfTableExistsIsTrue(bool authorise)
{
_tableExists = authorise;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (_tableExists)
return base.AuthorizeCore(httpContext);
else
throw new HttpException(404, "HTTP/1.1 404 Not Found");
}
}
感謝大家的幫助,並告訴我不要使用EF,而是使用配置設置
更好的選擇是將版本差異存儲為配置。 這可以存儲在數據庫本身,配置文件甚至web.config中。
否則你最終會得到像以下一樣的混亂代碼:
int result = entity.ExecuteStoreQuery<int>(@"
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'TableName')
SELECT 1
ELSE
SELECT 0
").SingleOrDefault();
唯一可行的方法是
ExecuteStoreQuery
直接從ObjectContext
執行查詢。 您的實體模型仍將具有此表,因此在我看來,您應該只使用該表和應用程序代碼句柄發送數據庫(如果允許或不允許使用該表)(表將不會被使用但將在數據庫中)。
如果您想制作模塊化系統,那么當客戶端不想使用它時,整個功能(包括應用程序代碼)就不應該存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.