目前,我正在开发一个依赖于(并因此连接到)各种数据库的应用程序,通过LINQ-to-SQL。对于其中一个数据库,连接字符串可能会有所不同,因此可配置 - 但是,此数据库的模式对于所有连接字符串都是相同的。
由于可配置的连接字符串,我想在启动应用程序期间验证DataContext,以确保我的应用程序使用的所有表和视图都可用。
Table<T>
对象中的DataContext
对象始终初始化 - 即使相应的SQL表或视图没有任何记录。
那么。目前,验证检查按如下方式执行:
bool valid = _dataContext.Articles.Count() > 0
&& _dataContext.Customers.Count() > 0
&& _dataContext.Orders.Count() > 0;
虽然这确实有效,但确定有效值需要相当长的时间(触摸每个表的每个记录),这最终会导致超时。那么,是否有更快,更可靠的方法来确定某个Table<T>
的{{1}}是否真的作为相应数据库中的表存在?
答案 0 :(得分:5)
这是一个(未经测试的)想法:
抓住你的桌子的名字。您可以对其进行硬编码,也可以通过
以编程方式获取TableAttribute attribute = (TableAttribute)typeof(MyTableObject)
.GetCustomAttributes(typeof(TableAttribute), true)
.Single();
string name = attribute.Name;
MyTableObject
是Table
中包含的LINQ-to-SQL生成对象,即T
中的通用参数Table<T>
。
(TableAttribute
位于System.Data.Linq.Mapping
。)
使用
中的DataContext.ExecuteQuery
方法
var db = new MyDataContext();
var results = db.ExecuteQuery<string>("SELECT name FROM dbo.sysobjects WHERE xtype = 'U'");
bool hasTable = results.Any(s => "dbo." + s == name);
答案 1 :(得分:4)
Jason的回答略有变化(我给了他一个upvote:))
public bool TableExistsInDatabase<T>()
{
TableAttribute attribute = (TableAttribute)typeof(T)
.GetCustomAttributes(typeof(TableAttribute), true)
.Single();
var result = ExecuteQuery<bool>(
String.Format(
"IF OBJECT_ID('{0}', 'U') IS NOT NULL
SELECT CAST(1 AS BIT) ELSE
SELECT CAST(0 AS BIT)", attribute.Name));
return result.First();
}