2011-03-07 92 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) 。

如果你想制作模块化系统,那么当客户端不想使用它时,你的所有功能(包括应用程序代码)都不应该存在。

相关问题