Zum Inhalt springen

Löschen eines Datensatzes


Empfohlene Beiträge

Geschrieben

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


               }

Geschrieben
Was heißt "dmc.DeleteObject funktioniert nicht"?

Wenn ich "dmc.DeleteObject(invetar)" mache, löscht er einfach nicht, es passiert eigentlich garnichts.

Geschrieben
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.

Geschrieben (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 von lilith2k3
Geschrieben

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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...