Pergunta

Atualmente, estou desenvolvendo um aplicativo que depende (e, portanto, se conecta a) várias bases de dados via LINQ to SQL. Para um dos bancos de dados, a seqüência de conexão pode variar e é, portanto, configurável - no entanto, o esquema desta base de dados é idêntica para todas as seqüências de conexão.

Por causa da seqüência de conexão configurável, quero validar o DataContext durante a inicialização do meu aplicativo, para se certificar de que todas as tabelas e exibições meus aplicativo usa, estão disponíveis.

Os objetos Table<T> no objeto DataContext são sempre inicializado - mesmo se a tabela SQL correspondente ou exibição não temos registos.

Então. Atualmente, a verificação de validação é realizada da seguinte forma:

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

Enquanto isso não funciona, a determinação do valor válido leva algum tempo (todos os registros de cada tabela é tocado), que resulta em um tempo fora. Assim, há uma maneira mais rápida, mais confiável para determinar se ou não um Table<T> de um certo DataContext realmente existe como uma tabela no banco de dados correspondente?

Foi útil?

Solução

Aqui está um (não testado) ideia:

Grab o nome de sua tabela. Você pode codificar-lo, ou você pode agarrá-lo por meio de programação via

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

MyTableObject é o objeto gerado LINQ to SQL contidas no seu Table, isto é, a T parâmetro genérico em Table<T>.

( TableAttribute está em System.Data.Linq.Mapping .)

Use o método DataContext.ExecuteQuery como em

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);    

Outras dicas

Uma pequena mudança na resposta de Jason (eu dei-lhe um 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top