2011-03-07 53 views
5

我們有一個已經部署到各種客戶端的數據庫。我們目前正在推出一項可選新功能,要使用這項功能,需要希望該功能的客戶將新表添加到現有數據庫中。使用LINQ檢查數據庫中是否存在表格

由於我們正在推出一款新的軟件,它將不得不與新版本的數據庫進行交互(並且我們不希望2版本的版本適用於擁有新表格和一個不支持的人)我們想知道是否可以通過編程方式確定(使用實體框架)數據庫中是否存在一個表(我可以嘗試訪問表並讓它拋出一個異常但想知道是否存在一個內置的函數來做到這一點)

感謝

編輯:鑑於人們告訴我,我應該使用一個配置文件中沒有用EF來檢查任何人都可以給我指導如何檢查配置文件,例如,爲mvc控制器定製數據註釋。類似於:

[Boolean(Properties.Settings.Default.TableExists)] 
public class NamedController : Controller 

如果爲false,會拋出一個找不到的頁面?

編輯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,這和使用的配置設置,而不是

+0

可能重複http://stackoverflow.com/questions/167576/sql-server-check-if-table-exists – 2011-03-07 10:32:19

+0

我不會爲此使用LINQ。當然,你可以映射數據庫模式元數據(我不會)。 – 2011-03-07 10:36:57

+0

@K伊萬諾夫不是真的重複,我問是否可以用Entity框架來完成,我已經知道如何使用SQL – Manatherin 2011-03-08 11:18:15

回答

7

更好的選擇是將版本差異存儲爲配置。這可以存儲在數據庫本身,配置文件甚至web.config中。

否則,你會擁有像亂碼:

int result = entity.ExecuteStoreQuery<int>(@" 
    IF EXISTS (SELECT * FROM sys.tables WHERE name = 'TableName') 
     SELECT 1 
    ELSE 
     SELECT 0 
    ").SingleOrDefault(); 
+0

如果我把它是否存在於一個配置文件中,我只是通常添加EF,只是如果表不存在,請忽略它? – Manatherin 2011-03-08 11:16:54

2

唯一可能的途徑是

  • 查詢表,並得到例外
  • 使用原生SQL查詢系統視圖並查找該表 - 在EFv4中,您可以通過調用ExecuteStoreQuery直接從ObjectContext執行查詢。

你的實體模型將仍然有這個表所以在我看來,你應該簡單地與該表,並在應用程序代碼中處理裝運DB如果功能允許或不允許(表將不會被使用,但會在DB) 。

如果你想製作模塊化系統,那麼當客戶端不想使用它時,你的所有功能(包括應用程序代碼)都不應該存在。

相關問題