C# 使用LINQ检查数据库中是否存在表

C# 使用LINQ检查数据库中是否存在表,c#,asp.net-mvc,linq,entity-framework,C#,Asp.net Mvc,Linq,Entity Framework,我们有一个已部署到各种客户端的数据库。我们目前正在引入一个可选的新功能,要使用该功能,将要求希望该功能的客户将新表添加到现有数据库中 当我们推出一款新的软件时,它必须与数据库的版本进行交互,无论有没有新表,我们都不需要两个版本,一个是给有新表的客户的,一个是给没有新表的客户的,我们想知道是否有可能通过entity framework以编程方式确定是否有一个表存在于数据库中,我可以尝试访问该表并让它抛出异常,但我想知道是否有内置函数来执行此操作 谢谢 编辑:如果有人告诉我应该使用配置文件,而不是使

我们有一个已部署到各种客户端的数据库。我们目前正在引入一个可选的新功能,要使用该功能,将要求希望该功能的客户将新表添加到现有数据库中

当我们推出一款新的软件时,它必须与数据库的版本进行交互,无论有没有新表,我们都不需要两个版本,一个是给有新表的客户的,一个是给没有新表的客户的,我们想知道是否有可能通过entity framework以编程方式确定是否有一个表存在于数据库中,我可以尝试访问该表并让它抛出异常,但我想知道是否有内置函数来执行此操作

谢谢

编辑:如果有人告诉我应该使用配置文件,而不是使用EF检查配置文件,那么有人能给我一些关于如何使用mvc控制器的自定义数据注释检查配置文件的指导吗。比如:

[Boolean(Properties.Settings.Default.TableExists)]
public class NamedController : Controller
如果为false,则哪个页面会抛出未找到的页面

编辑2:根据人们提出的使用配置设置的建议,我最终得到了以下解决方案

应用程序设置以设置表是否存在

<appSettings>
    <add key="tableExists" value="True"/>
</appSettings>
海关授权的代码

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,而是使用配置设置

查询表并获取异常 使用本机SQL查询系统视图并查找该表-在EFv4中,可以通过调用ExecuteStoreQuery直接从ObjectContext执行查询。 您的实体模型仍然会有这个表,所以在我看来,您应该简单地将您的数据库与该表一起发送,并在应用程序代码句柄中发送,若该特性被允许或不允许,那个么该表将不会被使用,但将在数据库中


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

更好的选择是将版本差异存储为配置。这可以存储在数据库本身、配置文件甚至web.config中

否则,您将得到混乱的代码,如:

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

可能的重复我不会为此使用LINQ。当然,你可以映射数据库模式元数据,我不会。@K Ivanov不是一个真正的副本,我在问是否可以用Entity framework完成,我已经知道如何用SQLIf完成。如果我把它是否存在于配置文件中,我是否正常添加EF,如果表不存在就忽略它?
int result = entity.ExecuteStoreQuery<int>(@"
    IF EXISTS (SELECT * FROM sys.tables WHERE name = 'TableName') 
        SELECT 1
    ELSE
        SELECT 0
    ").SingleOrDefault();