Быстрый способ определить, существует ли таблица DataContext или представление

StackOverflow https://stackoverflow.com/questions/1074190

  •  21-08-2019
  •  | 
  •  

Вопрос

В настоящее время я разрабатываю приложение, которое зависит от различных баз данных (и, следовательно, подключается к ним) через LINQ-to-SQL.Для одной из баз данных строка подключения может отличаться и, таким образом, настраивается - однако схема этой базы данных идентична для всех строк подключения.

Из-за настраиваемой строки подключения я хочу проверить DataContext во время запуска моего приложения, чтобы убедиться, что все таблицы и представления, используемые моим приложением, доступны.

В Table<T> объекты в DataContext объекты всегда инициализируются - даже если соответствующая таблица SQL или представление не содержат никаких записей.

Итак, тогда.В настоящее время проверка достоверности выполняется следующим образом:

        bool valid = _dataContext.Articles.Count() > 0
            && _dataContext.Customers.Count() > 0
            && _dataContext.Orders.Count() > 0;

Хотя это действительно работает, определение значения valid занимает довольно много времени (затрагивается каждая запись каждой таблицы), что в конечном итоге приводит к тайм-ауту.Итак, существует ли более быстрый и надежный способ определить, является ли Table<T> из определенного DataContext действительно существует в виде таблицы в соответствующей базе данных?

Это было полезно?

Решение

Вот (непроверенная) идея:

Введите название вашей таблицы.Вы можете жестко закодировать это, или вы можете захватить это программно с помощью

TableAttribute attribute = (TableAttribute)typeof(MyTableObject)
                           .GetCustomAttributes(typeof(TableAttribute), true)
                           .Single();
string name = attribute.Name;

MyTableObject содержится ли сгенерированный LINQ-to-SQL объект в вашем Table, т.е. общий параметр 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);    

Другие советы

Небольшое изменение в ответе Джейсона (я поддержал его :))

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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top