2011-01-13 2 views
1

Ich versuche Reflektion zu verwenden, um automatisch zu testen, ob alle meine linq2sql-Entitäten mit der Testdatenbank übereinstimmen. Ich dachte, ich dies tun würde, indem alle Klassen erhalten, die von Datacontext von meiner Baugruppe erben:Verwenden von Reflektion, um alle linq2sql-Tabellen zu finden und sicherzustellen, dass sie mit der Datenbank übereinstimmen

var contexttypes = Assembly.GetAssembly(typeof (BaseRepository<,>)).GetTypes().Where(
     t => t.IsSubclassOf(typeof(DataContext))); 
foreach (var contexttype in contexttypes) 
{ 
    var context = Activator.CreateInstance(contexttype); 
    var tableProperties = type.GetProperties().Where(t=> t.PropertyType.Name == typeof(ITable<>).Name); 
    foreach (var propertyInfo in tableProperties) 
     { 
      var table = (propertyInfo.GetValue(context, null)); 
     } 
} 

So weit, so gut, das durch jeden ITable<> in jedem Datacontext in der Projekt-Schleifen. Wenn ich den Code debugge, wird "Tabelle" ordnungsgemäß instanziiert und wenn ich die Ergebnisansicht in dem Debugger erweitere, kann ich tatsächliche Daten anzeigen.

ABER, ich kann nicht herausfinden, wie ich meinen Code bekomme, um diese Tabelle tatsächlich abzufragen. Ich würde wirklich gerne in der Lage sein, table.FirstOrDefault() zu tun, um die oberste Zeile aus jeder Tabelle zu holen und sicherzustellen, dass der SQL-Abruf nicht fehlschlägt. Aber ich kann diesen Tisch nicht als etwas darstellen, das ich abfragen kann.

Irgendwelche Vorschläge, wie ich diese Abfrage durchführen kann? Allein die Möglichkeit, .Count() aufzurufen, würde ausreichen, um sicherzustellen, dass die Entitäten nichts haben, was nicht mit den Tabellenspalten übereinstimmt.

+0

Mit "Übereinstimmung" beziehen Sie sich auf die Übereinstimmung der Datentypen? Oder betrachten Sie auch die Struktur (Fremdschlüssel etc.) und die Daten selbst? –

+0

Es gab Probleme, bei denen jemand eine Spalte aus einer Tabelle löschte, aber vergaß, sie aus den dbmls zu entfernen, was zu Ausnahmen führte, wenn dieser Datenkontext versuchte, auf die Tabelle zuzugreifen. Ich versuche wirklich nur, diese an einem Ort zu finden, so dass meine Repository-Unit-Tests später nicht wirklich auf die reale Datenbank treffen müssen. –

Antwort

1

Sobald Sie das Tabellenobjekt haben Sie es in die nicht-generic ITable Schnittstelle umgewandelt und dann verwenden, um die OfType<object>() Erweiterung Methode, um ein IEnumerable<object> zu erhalten, die Sie abfragen können:

object tableObject = GetTableFromReflection(); 
ITable table = (ITable)tableObject; 
table.OfType<object>().FirstOrDefault(); 

EDIT: Gerade gesehen, das SO Anzeige auf dieser Seite. Siehe seine zweite Kugel:

alt text

Nun, das ist, was ich gezielte Werbung nennen!

+0

Aha, der Tisch. Von Typ war die geheime Sauce, die ich vermisste. Vielen Dank! –

Verwandte Themen