Frage

Derzeit entwickle ich eine Anwendung, die auf abhängt (und damit eine Verbindung zu) verschiedenen Datenbanken über LINQ to SQL. Für eine der Datenbanken ist die Verbindungszeichenfolge variiert und kann so konfiguriert werden - aber das Schema der Datenbank ist für alle Verbindungszeichenfolgen identisch.

Aufgrund der konfigurierbaren Verbindungszeichenfolge, mag ich die Datacontext während des Anlaufs meiner Anwendung überprüfen, um sicherzustellen, dass alle Tabellen und Ansichten meine Anwendung verwendet, zur Verfügung.

Die Table<T> Objekte im DataContext Objekt werden immer initialisiert - auch wenn die entsprechende SQL-Tabelle oder Sicht keine Datensätze hat.

So dann. Derzeit wird die Gültigkeitsprüfung durchgeführt, wie folgt:

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

Während diese Arbeit tut, erfolgt die Bestimmung des Wertes der gültigen einige Zeit (alle Datensätze jeder Tabelle berührt wird), was letztlich in einer Zeit führt aus. So gibt es eine schnellere, zuverlässigere Art und Weise, um zu bestimmen, ob ein Table<T> eines bestimmten DataContext wirklich als Tabelle in der entsprechenden Datenbank vorhanden ist?

War es hilfreich?

Lösung

Hier ist eine (nicht getestet) Idee:

Nutzen Sie den Namen Ihrer Tabelle. Sie können es schwer Code in, oder Sie können es über

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

MyTableObject ist das LINQ to SQL erzeugten Objekt in Ihrem Table enthielt, das heißt, die generischen Parameter T in Table<T>.

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

Mit der DataContext.ExecuteQuery Methode wie 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);    

Andere Tipps

Eine leichte Veränderung auf Jasons Antwort (ich gab ihm eine 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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top