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?

¿Fue útil?

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top