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

Man*_*rin 5 c# linq asp.net-mvc entity-framework

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

正在我们推出一款新软件,无论是否有新表,都必须与数据库版本进行交互(因为我们不希望有2个版本用于拥有新表的客户和一个用于不是)我们想知道是否有可能以编程方式确定(使用实体框架)数据库中是否存在表(我可以尝试访问该表并让它抛出异常但是想知道是否有内置函数去做这个)

谢谢

编辑:鉴于人们告诉我我应该使用配置文件不检查EF,任何人都可以指导我如何检查配置文件,例如,mvc控制器的自定义数据注释.就像是:

[Boolean(Properties.Settings.Default.TableExists)]
public class NamedController : Controller
Run Code Online (Sandbox Code Playgroud)

如果错误,会抛出未找到的页面?

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

用于设置表是否存在的应用程序设置

<appSettings>
    <add key="tableExists" value="True"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)

自定义数据注释,以说明是否允许访问控制器

[AuthoriseIfTableExistsIsTrue]
public class NamedController : Controller
Run Code Online (Sandbox Code Playgroud)

自定义授权的代码

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢大家的帮助,并告诉我不要使用EF,而是使用配置设置

edd*_*ves 7

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

否则你最终会得到像以下一样的混乱代码:

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