Domanda

Attualmente, sto sviluppando un'applicazione che dipende dalla (e quindi si connette a) varie banche dati tramite LINQ to SQL. Per uno dei database, la stringa di connessione può variare ed è quindi configurabile - tuttavia, lo schema di questo database è identico per tutte le stringhe di connessione.

A causa della stringa di connessione configurabile, voglio convalidare il DataContext durante l'avvio della mia candidatura, per assicurarsi che tutte le tabelle e le viste utilizza la mia domanda, sono disponibili.

I Table<T> oggetti nel DataContext oggetto sono sempre inizializzato - anche se la tabella di SQL corrispondente o visualizzazione non hanno alcun record.

E allora. Attualmente, il controllo di convalida è effettuata come segue:

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

Anche se questo funziona, la determinazione del valore di validità acquisisce un bel po 'di tempo (ogni record di ogni tabella viene toccato), che alla fine si traduce in un time out. Quindi, c'è un modo più veloce, più affidabile per determinare se un <=> di un certo <=> esiste davvero come una tabella nel database corrispondente?

È stato utile?

Soluzione

Ecco un (non testata) idea:

Afferra il nome della tabella. È difficile possibile codificare in, oppure si può prendere a livello di codice tramite

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

MyTableObject è SQL LINQ to dell'oggetto generato contenuta nel Table, cioè il parametro generico T in Table<T>.

( TableAttribute è in System.Data.Linq.Mapping .)

Utilizza il DataContext.ExecuteQuery metodo come in

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

Altri suggerimenti

Un leggero cambiamento sulla risposta di Jason (gli ho dato un 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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top