2016-05-13 3 views
1

Ich muss einen Weg finden, herauszufinden, was der SQL SELECT, der bei der Interaktion mit EF generiert wird, ist. Ich habe die MSDN-Onlinehilfe gefunden, die sie beschreibt ObjectQuery.ToTraceString Method() und ich bin sicher, dass ich dem Beispiel genau gefolgt bin, aber es ist fehlgeschlagen. Ich erhalte die folgende Fehlermeldung:Der Versuch, dem Beispiel für ToTraceString() zu folgen, schlägt fehl. Warum?

CS1503 Argument 2: kann nicht von ‚string‘ in ‚System.Linq.Expressions.Expression>‘ konvertieren

ich nicht, warum ich diesen Fehler bin immer. Hier ist der Code, der den Fehler erzeugt:

Der MyDbContext ist eine Klasse, die ich definiert habe. Hier ist es die Definition:

public class MyDbContext : Model.CoreFrameworkEntities 
{ 
    public override int SaveChanges() 
    { 
     var modifiedEntities = ChangeTracker.Entries() 
       .Where(p => p.State == EntityState.Modified) 
       .Select(p => p.Entity); 

     foreach (var modified in modifiedEntities) 
     { 
      Console.WriteLine(); 
      //modified.LastModifiedAt = now; 
      Console.WriteLine(modified.ToString()); 
      Console.WriteLine(); 
     } 
     return base.SaveChanges(); 
    } 
} 

Und schließlich Model.CoreframeworkEntities ist ein EF-Modell definiert eine EDMX-Datei zu erstellen. Es ist eine der Entitäten in der EDMX. (Ich verstehe, dass jede Entität, die in einer EDMX-Datei definiert ist, ein DbContext-Datentyp ist. Wenn das falsch ist, würde ich es gerne wissen.)

Ich bin mir nicht sicher, warum ich den Fehler bekomme das bin ich. Es scheint mir, als ob ich den MSDN-Artikel im Code verfolgt habe. Entweder ist der MSDN-Artikel nicht mehr gültig oder ich habe einen Fehler gemacht, möglicherweise in meinem Verständnis, was die Entitäten in einer Entitätsbeziehung/.edmx-Datei alles bedeuten. Ich hätte gerne Hilfe.

Antwort

2

Das liegt daran, dass dieser Artikel den von ObjectContext übernommenen Kontext verwendet. Sie verwenden den von DbContext geerbten Kontext. Das alte ObjectContext hat ObjectSets, die in der Tat hat Where Überladung, die Zeichenfolge akzeptiert und ObjectQuery zurückgibt. Allerdings DbContext (die Sie verwenden) hat DbSets und Where Methoden auf ihnen akzeptieren keine Zeichenfolgen, sondern nur Ausdrücke daher Ihren Fehler. Mit DbContext entweder verwenden Sie in der Regel Abfangjäger oder Database.Log Eigenschaft, wie folgt aus:

db.Database.Log = Console.WriteLine; // or any other handler 
var templates = db.Templates.Where(c => c.ID == idNum).ToArray(); // sql will be written to console. 

Als Gert Arnold in den Kommentaren erwähnt, können Sie auch ToString() auf Abfrage aufrufen:

db.Templates.Where(c => c.ID == idNum).ToString() 

jedoch in einigen Fällen Sie können das nicht tun (zum Beispiel beenden Sie Ihre Abfrage mit Count() oder und so weiter). Aber wenn Sie das tun können, und Sie brauchen nur SQL für eine bestimmte einzelne Abfrage - natürlich ToString Methode ist besser.

+0

Oder 'db.Templates.Where (c => c.ID == idNum) .ToString()'. –

+0

Danke Evk und Gert. Ihre Erklärung, warum es nicht funktioniert hat (weil der Artikel ObjectContext verwendet und ich eine Klasse verwende, die von DbContext abgeleitet ist), ist sinnvoll. (Nur eine Seite, ich wünschte, die Leute würden ihre Blogposts datieren.) Ich benutze FirstOrDefault(), also sollte ich vielleicht zuerst die ToString() benutzen und dann eine andere C# -Anweisung mit FirstOrDefault() machen. – Rod

Verwandte Themen