Logga förändringar i Linq Data Context

Inte för att jag inte litar på att Microsoft gjort rätt med Linq to SQL, men det kan ju alltid vara bra att kontrollera att det man själv gör ger förväntat resultat innan man anropar DataContext.SubmitChanges.
Jag slängde därför ihop följande lilla funktion för att (med hjälp av NLog) logga vad som kommer att förändras.

internal static class Helpers
{
	private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

	[Conditional("DEBUG")]
	internal static void LogChanges(DataContext context)
	{
		Logger.Trace("LogChanges()");

		var changeSet = context.GetChangeSet();

		Logger.Debug("Inserts = {0}", changeSet.Inserts.Count);
		Logger.Debug("Updates = {0}", changeSet.Updates.Count);
		Logger.Debug("Deletes = {0}", changeSet.Deletes.Count);

		foreach (object item in changeSet.Inserts)
		{
			Logger.Debug("New entity!");
			foreach (var info in item.GetType().GetProperties())
			{
				if (info.CanRead)
				{
					Logger.Debug("'{0}' = '{1}'", info.Name, info.GetValue(item, null));
				}
			}
		}

		foreach (object item in changeSet.Updates)
		{
			Logger.Debug("Changed entity!");

			var table = context.GetTable(item.GetType());
			var changes = table.GetModifiedMembers(item);

			foreach (var info in changes)
			{
				Logger.Debug("'{0}': '{1}' -> '{2}'", info.Member.Name, info.OriginalValue, info.CurrentValue);
			}
		}

		foreach (object item in changeSet.Deletes)
		{
			Logger.Debug("Removed entity!");
			foreach (var info in item.GetType().GetProperties())
			{
				if (info.CanRead)
				{
					Logger.Debug("'{0}' = '{1}'", info.Name, info.GetValue(item, null));
				}
			}
		}
	}
}

I mitt projekt så anropas det enligt följande:

public void SomeFunction()
{
	using (var context = new SomeDataContext(_connectionString))
	{
		var entity = context.SomeEntities.Single(x => x.Id == 1);
		entity.Name = "Nytt namn";

		Helpers.LogChanges(context);

		// Ändra inget just nu, logga bara med raden ovan.
		// context.SubmitChanges();
	}
}

leave your comment