Gast Max1809 Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 Hi, eine kurze Frage - wie lösche ich einen Datensatz in meiner DB mit Hilfe von LINQ-Abfragen/Ausdrücken ? MSDN hilft mir nicht wirklich weiter, mein Problem ist das ich in einem Test, Testsätze erstelle, die aber danach eig. wieder löschen will - damit ein anderer Test auch funktioniert. Okey, wie realisiere ich das? Hier mein Code mit der Abfrage, weiter komm ich nicht, "dmc.DeleteObject" funktioniert nicht. IQueryable<DtoInventar> abfrage = from inventar in dmc.DbInventare select inventar; // hier holle ich mir alle datensätze der DB ( alle, weil ich nicht mehr habe als die 3 neuangelegten => ich holle mir keine falschen foreach (DtoInventar inventar in abfrage) { // hier soll das löschen passieren } Zitieren
Guybrush Threepwood Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 Was heißt "dmc.DeleteObject funktioniert nicht"? Zitieren
Gast Max1809 Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 Was heißt "dmc.DeleteObject funktioniert nicht"? Wenn ich "dmc.DeleteObject(invetar)" mache, löscht er einfach nicht, es passiert eigentlich garnichts. Zitieren
realgun Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 Wenn ich "dmc.DeleteObject(invetar)" mache, löscht er einfach nicht, es passiert eigentlich garnichts. Verwendest Du einen OR-Mapper? Dann musst Du auch so was wie "SaveChanges()" auf dem Context aufrufen. Btw.: LINQ ist eine Abfragesprache, damit kannst Du gar nichts löschen. Zitieren
lilith2k3 Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 (bearbeitet) Verwendest Du einen OR-Mapper? Dann musst Du auch so was wie "SaveChanges()" auf dem Context aufrufen. Btw.: LINQ ist eine Abfragesprache, damit kannst Du gar nichts löschen. LINQ to SQL stellt das OR-Mapping her. Zwar ist LINQ per se eine Abfragesprache, wie Du sagst - dennoch gehört es mit zu LINQtoSQL entsprechendes auf SQL-Seite zu veranlassen. SQL-Aufgaben lassen sich bequem durch LINQ erledigen. Man benötigt in dem Falle einfach die Methode DeleteOnSubmit(), resp. SubmitChanges(). Alles weitere unter: Insert-, Update- und Delete-Operationen (LINQ to SQL) P.S.: MSDN hilft mir nicht wirklich weiter Das halte ich für ein Gerücht Bearbeitet 20. Januar 2011 von lilith2k3 Zitieren
NerdonRails Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 Wenn du unit-tests gegen mit Linq2Sql oder EF fahren willst, würde ich dir empfehlen, den Datenkontext zu mocken. Der Datenbank-Ansatz ist ab einer gewissen Test-Anzahl einfach nicht mehr performant genug um die Test mehrmals am Tag laufen zu lassen. Als erstes braucht man dafür ein Objekt das Mock-Objectset dastellt: public class MockedObjectSet<T> : IObjectSet<T> where T : class { public MockedObjectSet(List<T> entityList) { if (entityList == null) { throw new ArgumentNullException("entityList"); } else { repository = entityList.ToList(); } } IList<T> repository; #region IObjectSet<T> Members public void AddObject(T entity) { repository.Add(entity); } public void Attach(T entity) { this.AddObject(entity); } public void DeleteObject(T entity) { repository.Remove(entity); } #endregion #region IEnumerable<T> Members public IEnumerator<T> GetEnumerator() { return repository.GetEnumerator(); } #endregion #region IEnumerable Members System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return repository.GetEnumerator(); } #endregion #region IQueryable Members public Type ElementType { get { return typeof(T); } } public System.Linq.Expressions.Expression Expression { get { return repository.AsQueryable<T>().Expression; } } public IQueryProvider Provider { get { return repository.AsQueryable<T>().Provider; } } #endregion #region IObjectSet<T> Members public void Detach(T entity) { this.DeleteObject(entity); } #endregion } Danach eine kleine extension die das erstellen des Mock-Objektes übernimmt: public static class MockExtensions { public static IObjectSet<T> AsObjectSet<T>(this List<T> entities) where T : class { return new MockedObjectSet<T>(entities); } } Als nächstes muss man aus der Klasse die von ObjectContext erbt ein Interface extrahieren. Das Interface wird benötigt um, z.B. in meinem Fall mit RhinoMocks, ein gemocktes Objekt zu erstellen. IDatabaseEntitiesContainer context = MockRepository.GenerateStub<IDatabaseEntitiesContainer>(); List<Customer> customersList = new List<Customer>() { customer }; IObjectSet<Customer> customers = customersList.AsObjectSet(); context.Stub(stub => stub.Customers).Return(customers); Über den gemockten Context kann man nun in aller Ruhe, nachdem man ihn mit Daten befüllt hat, linq-queries und Datenbank-Operationen testen ohne eine Datenbank anpacken zu müssen. Zitieren
SilentDemise Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 Erschlag ihn doch nicht direkt mit Mocks in Unit Tests ;-) hat mit seiner ursprünglichen Frage ja relativ wenig zu tun. Wenn er Probleme mit dem löschen per Linq2SQL hat, wird er sicherlich keine Erfahrung mit Mocking haben. :-) Zitieren
NerdonRails Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 MSDN hilft mir nicht wirklich weiter, mein Problem ist das ich in einem Test, Testsätze erstelle, die aber danach eig. wieder löschen will - damit ein anderer Test auch funktioniert. Das klingt für mich nach Tests Zitieren
SilentDemise Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 Nur weil er testet, muss er ja nicht mocken ;-) Zitieren
NerdonRails Geschrieben 20. Januar 2011 Geschrieben 20. Januar 2011 Ist aber ein sauberer Ansatz Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.