2010-12-09 19 views
6

Ich erhalte ein Problem bei der Verwendung von EF4, wenn ich versuche zu überprüfen, ob das Objekt bereits im Entity Framework-Kontext ist.Überprüfen, ob das Objekt bereits im Entity Framework-Kontext ist

Ich habe diesen Code unter

 var entityName = Entity4Test + Guid.NewGuid(); 

     using(var ctx = new EnviroDataContext()) 
     { 
      var etc = new Entity 
      { 
       Name = entityName 
      }; 

      ctx.Entity.AddObject(etc); 

       var q = from p in ctx.Entity 
         where p.Name == entityName 
         select p; 

// Why 'q.ToList().Count == 0'? 

       ctx.SaveChanges(); 
      } 

Meine Frage ist, warum nach dem Einsetzen meiner Suche kam leer?

Ich weiß, dass die Daten nach "SaveChanges" beibehalten werden, aber was ist, wenn ich meine Entity-Speicherdaten "abfragen" muss.

Erweiterung der Frage

ich ein Unternehmen haben in der Regel, dass durch Zugabe von 1 Punkt A, löst das Einfügen von anderen Entitäten B. Das Problem ist, ich Gültigkeitsregel haben, dass beim Einsetzen von B, t A muss schon existieren.

Da alle diese Aktionen vor 'SaveChanges' ausgeführt werden, erhalte ich den Fehler, dass EntityA nicht existiert.

Anderer Fall, ich habe ein Namensfeld, das in einer Tabelle eindeutig ist. Wenn ich versuche, AddEntityName ("bla") zweimal und dann "SaveChanges" auszuführen, erhalte ich eine Ausnahme von DB [Unique constraints], auch nachdem ich meine Validierung für die Einfügung bestanden habe, die garantiert, dass ein Name eindeutig ist.

Wer hat eine Idee?

Antwort

9

Wenn Sie .AddObject tun, fügt es es zu EF internen "Grafik" (Speicher) in einem ausstehenden Zustand von "Hinzugefügt".

Nur wenn Sie ctx.SaveChanges() tun, werden die Änderungen im zugrundeliegenden Speicher beibehalten.

Die Abfrage, die Sie schreiben, ist gegen die Datenbank, und die Änderung wurde noch nicht beibehalten.

Also, wenn Sie Ihre Abfrage ausführen nach Sie ctx.SaveChanges() tun, wird die Anzahl wie erwartet sein.

Auf einer Seite beachten, wenn Sie, wenn ein Unternehmen sehen wollen, ist bereits in der Grafik (z bevor Sie „Attach“), lesen ObjectStateManager.TryGetObjectStateEntry auf bis.

+0

Ich verstehe, was Sie sagen, aber die Frage ist, wenn dieses Verhalten sinnvoll ist, wenn Sie Geschäftsregeln haben, die mehr Einfügungen und Validierungen impliziert? – muek

+0

@muek - Entschuldigung, verstehe deine Frage nicht. Was meinen Sie? – RPM1984

+0

lol mein Schlechter. Schau dir meine erweiterte Frage an. – muek

1

Ich habe nicht EF4 verwendet, aber habe die vorherige Version verwendet, so dass ich nicht weiß, ob sie eine andere Erwartung in EF4 ist. Es sieht so aus, als ob Sie nach dem Asset in der Datenbank suchen, bevor Sie es tatsächlich übergeben. Sie sollten SaveChanges zuerst aufrufen und dann danach suchen.

Verwandte Themen