forma rápida de detectar si existe una tabla o vista DataContext
-
21-08-2019 - |
Pregunta
Actualmente, estoy desarrollando una aplicación que depende de (y por lo tanto se conecta a) varias bases de datos a través de LINQ a SQL. Para una de las bases de datos, la cadena de conexión puede variar y por lo tanto es configurable - sin embargo, el esquema de esta base de datos es idéntico para todas las cadenas de conexión.
Debido a la cadena de conexión configurable, quiero validar el DataContext durante el inicio de mi solicitud, para asegurarse de que todas las tablas y vistas que utiliza mi aplicación, están disponibles.
Los Table<T>
objetos en el DataContext
objeto siempre se inicializan - incluso si la tabla de SQL correspondiente o vista no tienen ningún registro.
Así entonces. Actualmente, la comprobación de validación se realiza de la siguiente manera:
bool valid = _dataContext.Articles.Count() > 0
&& _dataContext.Customers.Count() > 0
&& _dataContext.Orders.Count() > 0;
Si bien esto funciona, la determinación del valor del período de validez desde hace bastante tiempo (cada registro de cada tabla se toca), que finalmente resulta en un tiempo de espera. Entonces, ¿hay una manera más rápida, más fiable para determinar si es o no un <=> de una cierta <=> existe realmente como una tabla en la base de datos correspondiente?
Solución
Aquí es una idea (no probado):
Coge el nombre de la tabla. Puede codificar duro en, o se puede agarrar mediante programación a través de
TableAttribute attribute = (TableAttribute)typeof(MyTableObject)
.GetCustomAttributes(typeof(TableAttribute), true)
.Single();
string name = attribute.Name;
MyTableObject
es el SQL LINQ-to-objeto generado contenía en su Table
, es decir, el parámetro genérico T
en Table<T>
.
( TableAttribute
está en System.Data.Linq.Mapping
).
Utilice la DataContext.ExecuteQuery
método que en el
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);
Otros consejos
Un ligero cambio en la respuesta de Jason (I le dio una 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();
}