我们有一个已部署到各种客户端的数据库。我们目前正在引入一个可选的新功能,该功能将要求希望该功能的客户将新表添加到现有数据库中。
正在我们推出一款新软件,无论是否有新表,都必须与数据库版本进行交互(因为我们不希望有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,而是使用配置设置
答案 0 :(得分:7)
更好的选择是将版本差异存储为配置。这可以存储在数据库本身,配置文件甚至web.config中。
否则你最终会得到像:
这样的混乱代码int result = entity.ExecuteStoreQuery<int>(@"
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'TableName')
SELECT 1
ELSE
SELECT 0
").SingleOrDefault();
答案 1 :(得分:2)
唯一可行的方法是
ObjectContext
直接从ExecuteStoreQuery
执行查询。你的实体模型仍然会有这个表,所以在我看来,如果允许或不允许功能,你应该只使用该表和应用程序代码句柄发送数据库(表将不会被使用,但将在数据库中)。
如果您想制作模块化系统,那么当客户不想使用它时,整个功能(包括应用程序代码)都不应该存在。