From 35031c8692ed2737e6c13a8d5faa7ab6436216e7 Mon Sep 17 00:00:00 2001 From: David Paquette Date: Sun, 1 Feb 2015 15:11:21 -0500 Subject: [PATCH 1/4] Improved exception handling and error reporting Resolves issue #3 --- .../CountriesFileWithErrors.csv | 5 +++ .../EntityFramework.Seeder.EF6.Tests.csproj | 4 ++ ...n_an_error_occurs_while_seeding_a_dbset.cs | 37 +++++++++++++++++++ .../EFSeederException.cs | 33 +++++++++++++++++ .../EntityFramework.Seeder.EF6.csproj | 1 + src/EntityFramework.Seeder.EF6/Seeder.cs | 30 +++++++++------ 6 files changed, 99 insertions(+), 11 deletions(-) create mode 100644 src/EntityFramework.Seeder.EF6.Tests/CountriesFileWithErrors.csv create mode 100644 src/EntityFramework.Seeder.EF6.Tests/when_an_error_occurs_while_seeding_a_dbset.cs create mode 100644 src/EntityFramework.Seeder.EF6/EFSeederException.cs diff --git a/src/EntityFramework.Seeder.EF6.Tests/CountriesFileWithErrors.csv b/src/EntityFramework.Seeder.EF6.Tests/CountriesFileWithErrors.csv new file mode 100644 index 0000000..fa26ed0 --- /dev/null +++ b/src/EntityFramework.Seeder.EF6.Tests/CountriesFileWithErrors.csv @@ -0,0 +1,5 @@ +CodeNotRight,NameAlsoNotRight +AT,Austria +AU,Australia +CA,Canada +US,United States \ No newline at end of file diff --git a/src/EntityFramework.Seeder.EF6.Tests/EntityFramework.Seeder.EF6.Tests.csproj b/src/EntityFramework.Seeder.EF6.Tests/EntityFramework.Seeder.EF6.Tests.csproj index 29fe5db..55f93fb 100644 --- a/src/EntityFramework.Seeder.EF6.Tests/EntityFramework.Seeder.EF6.Tests.csproj +++ b/src/EntityFramework.Seeder.EF6.Tests/EntityFramework.Seeder.EF6.Tests.csproj @@ -79,6 +79,7 @@ + @@ -98,6 +99,9 @@ Always + + Always + diff --git a/src/EntityFramework.Seeder.EF6.Tests/when_an_error_occurs_while_seeding_a_dbset.cs b/src/EntityFramework.Seeder.EF6.Tests/when_an_error_occurs_while_seeding_a_dbset.cs new file mode 100644 index 0000000..35d2cb7 --- /dev/null +++ b/src/EntityFramework.Seeder.EF6.Tests/when_an_error_occurs_while_seeding_a_dbset.cs @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using EntityFramework.Seeder.EF6.Tests.Domain; +using Given.Common; +using Given.NUnit; +using NUnit.Framework; + +namespace EntityFramework.Seeder.EF6.Tests +{ + [Story(AsA = "developer", + IWant = "see exception details", + SoThat = "I can diagnose errors that might happen while seeding a dbset")] + public class while_an_error_occurs_while_seeding_a_dbset : Scenario + { + public static CountryContext _context; + + given an_empty_context = () => + { + _context = new CountryContext(); + _context.DeleteAll(); + }; + + + [then] + [ExpectedException(typeof(EfSeederException))] + public void when_seeding_from_a_file_with_unmapped_columns() + { + _context.Countries.SeedFromFile("CountriesFileWithErrors.csv", c => c.Code); + } + + [TestFixtureTearDown] + public void TearDown() + { + _context.Dispose(); + } + } +} \ No newline at end of file diff --git a/src/EntityFramework.Seeder.EF6/EFSeederException.cs b/src/EntityFramework.Seeder.EF6/EFSeederException.cs new file mode 100644 index 0000000..650f961 --- /dev/null +++ b/src/EntityFramework.Seeder.EF6/EFSeederException.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace EntityFramework.Seeder +{ + /// + /// Represents an exception that has occurred while seeding a dbset. + /// Wraps the underlying exception and is serializable so that the exception message can be + /// properly displayed in the package manager console in Visual Studio + /// + public class EfSeederException : Exception, ISerializable + { + public EfSeederException() + { + } + + public EfSeederException(string message) : base(message) + { + } + + public EfSeederException(string message, Exception innerException) : base(message, innerException) + { + } + + protected EfSeederException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/EntityFramework.Seeder.EF6/EntityFramework.Seeder.EF6.csproj b/src/EntityFramework.Seeder.EF6/EntityFramework.Seeder.EF6.csproj index c04b7bb..a63ec74 100644 --- a/src/EntityFramework.Seeder.EF6/EntityFramework.Seeder.EF6.csproj +++ b/src/EntityFramework.Seeder.EF6/EntityFramework.Seeder.EF6.csproj @@ -52,6 +52,7 @@ + diff --git a/src/EntityFramework.Seeder.EF6/Seeder.cs b/src/EntityFramework.Seeder.EF6/Seeder.cs index a9ceadf..a0dd0ab 100644 --- a/src/EntityFramework.Seeder.EF6/Seeder.cs +++ b/src/EntityFramework.Seeder.EF6/Seeder.cs @@ -23,23 +23,31 @@ public static class Seeder /// Any additonal complex mappings required public static void SeedFromStream(this IDbSet dbSet, Stream stream, Expression> identifierExpression, params CsvColumnMapping[] additionalMapping) where T : class { - using (StreamReader reader = new StreamReader(stream)) + try { - CsvReader csvReader = new CsvReader(reader); - var map = csvReader.Configuration.AutoMap(); - map.ReferenceMaps.Clear(); - csvReader.Configuration.RegisterClassMap(map); - csvReader.Configuration.WillThrowOnMissingField = false; - while (csvReader.Read()) + using (StreamReader reader = new StreamReader(stream)) { - var entity= csvReader.GetRecord(); - foreach (CsvColumnMapping csvColumnMapping in additionalMapping) + CsvReader csvReader = new CsvReader(reader); + var map = csvReader.Configuration.AutoMap(); + map.ReferenceMaps.Clear(); + csvReader.Configuration.RegisterClassMap(map); + csvReader.Configuration.WillThrowOnMissingField = false; + while (csvReader.Read()) { - csvColumnMapping.Execute(entity, csvReader.GetField(csvColumnMapping.CsvColumnName)); + var entity = csvReader.GetRecord(); + foreach (CsvColumnMapping csvColumnMapping in additionalMapping) + { + csvColumnMapping.Execute(entity, csvReader.GetField(csvColumnMapping.CsvColumnName)); + } + dbSet.AddOrUpdate(identifierExpression, entity); } - dbSet.AddOrUpdate(identifierExpression, entity); } } + catch (Exception ex) + { + string message = string.Format("Error Seeding DbSet {0}: {1}", dbSet.GetType().Name, ex.Message); + throw new EfSeederException(message, ex); + } } /// From 222d2cd52a7898e8423eb3a20102990e2637c074 Mon Sep 17 00:00:00 2001 From: David Paquette Date: Sun, 1 Feb 2015 15:26:32 -0500 Subject: [PATCH 2/4] Marking exception as serializable and ensuring non-serializable excpetions are not added as inner exceptions --- .../EntityFramework.Seeder.EF6.0.3.0.nupkg | Bin 0 -> 6053 bytes ...n_an_error_occurs_while_seeding_a_dbset.cs | 37 ++++++++++++++++++ .../EFSeederException.cs | 1 + .../Properties/AssemblyInfo.cs | 6 +-- src/EntityFramework.Seeder.EF6/Seeder.cs | 3 +- 5 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 package/EntityFramework.Seeder.EF6.0.3.0.nupkg diff --git a/package/EntityFramework.Seeder.EF6.0.3.0.nupkg b/package/EntityFramework.Seeder.EF6.0.3.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..c268c4d73540f0d05b8bae6f6648b867aaa94b7c GIT binary patch literal 6053 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 c.Code); } + [then] + public void the_exception_should_be_serializable() + { + EfSeederException exception = null; + try + { + _context.Countries.SeedFromFile("CountriesFileWithErrors.csv", c => c.Code); + } + catch (EfSeederException ex) + { + exception = ex; + } + + Assert.IsNotNull(exception); + + string exceptionToString = exception.ToString(); + + // Round-trip the exception: Serialize and de-serialize with a BinaryFormatter + BinaryFormatter bf = new BinaryFormatter(); + using (MemoryStream ms = new MemoryStream()) + { + // "Save" object state + bf.Serialize(ms, exception); + + // Re-use the same stream for de-serialization + ms.Seek(0, 0); + + // Replace the original exception with de-serialized one + exception = (EfSeederException)bf.Deserialize(ms); + } + + // Double-check that the exception message and stack trace (owned by the base Exception) are preserved + Assert.AreEqual(exceptionToString, exception.ToString(), "ex.ToString()"); + } + [TestFixtureTearDown] public void TearDown() { diff --git a/src/EntityFramework.Seeder.EF6/EFSeederException.cs b/src/EntityFramework.Seeder.EF6/EFSeederException.cs index 650f961..961f63a 100644 --- a/src/EntityFramework.Seeder.EF6/EFSeederException.cs +++ b/src/EntityFramework.Seeder.EF6/EFSeederException.cs @@ -12,6 +12,7 @@ namespace EntityFramework.Seeder /// Wraps the underlying exception and is serializable so that the exception message can be /// properly displayed in the package manager console in Visual Studio /// + [Serializable] public class EfSeederException : Exception, ISerializable { public EfSeederException() diff --git a/src/EntityFramework.Seeder.EF6/Properties/AssemblyInfo.cs b/src/EntityFramework.Seeder.EF6/Properties/AssemblyInfo.cs index 1daca51..0629548 100644 --- a/src/EntityFramework.Seeder.EF6/Properties/AssemblyInfo.cs +++ b/src/EntityFramework.Seeder.EF6/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("EntityFramework.Seeder")] -[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.2.1.0")] -[assembly: AssemblyFileVersion("0.2.1.0")] +[assembly: AssemblyVersion("0.3.0.0")] +[assembly: AssemblyFileVersion("0.3.0.0")] diff --git a/src/EntityFramework.Seeder.EF6/Seeder.cs b/src/EntityFramework.Seeder.EF6/Seeder.cs index a0dd0ab..586d160 100644 --- a/src/EntityFramework.Seeder.EF6/Seeder.cs +++ b/src/EntityFramework.Seeder.EF6/Seeder.cs @@ -46,7 +46,8 @@ public static void SeedFromStream(this IDbSet dbSet, Stream stream, Expres catch (Exception ex) { string message = string.Format("Error Seeding DbSet {0}: {1}", dbSet.GetType().Name, ex.Message); - throw new EfSeederException(message, ex); + Exception innerException = ex.GetType().IsSerializable ? ex : null; + throw new EfSeederException(message, innerException); } } From a973216c2998896bbe5fcc50803cec9d628c86d1 Mon Sep 17 00:00:00 2001 From: David Paquette Date: Sun, 1 Feb 2015 15:32:21 -0500 Subject: [PATCH 3/4] Version bump --- package/EntityFramework.Seeder.EF6.0.3.1.nupkg | Bin 0 -> 6099 bytes .../Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 package/EntityFramework.Seeder.EF6.0.3.1.nupkg diff --git a/package/EntityFramework.Seeder.EF6.0.3.1.nupkg b/package/EntityFramework.Seeder.EF6.0.3.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..25ae13ae13814f5753924a1c4cdc5dacdaa6e65a GIT binary patch literal 6099 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 Date: Mon, 2 Feb 2015 12:39:24 -0500 Subject: [PATCH 4/4] Actually reporting full exception message in Package Manager Console --- .../EntityFramework.Seeder.EF6.0.3.2.nupkg | Bin 0 -> 6411 bytes ...n_an_error_occurs_while_seeding_a_dbset.cs | 8 +++---- .../Properties/AssemblyInfo.cs | 4 ++-- src/EntityFramework.Seeder.EF6/Seeder.cs | 21 ++++++++++++++++-- 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 package/EntityFramework.Seeder.EF6.0.3.2.nupkg diff --git a/package/EntityFramework.Seeder.EF6.0.3.2.nupkg b/package/EntityFramework.Seeder.EF6.0.3.2.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..f3a71a2548145776481758d68713b0192f75ab6d GIT binary patch literal 6411 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 c.Code); @@ -33,12 +33,12 @@ public void when_seeding_from_a_file_with_unmapped_columns() [then] public void the_exception_should_be_serializable() { - EfSeederException exception = null; + Exception exception = null; try { _context.Countries.SeedFromFile("CountriesFileWithErrors.csv", c => c.Code); } - catch (EfSeederException ex) + catch (Exception ex) { exception = ex; } @@ -58,7 +58,7 @@ public void the_exception_should_be_serializable() ms.Seek(0, 0); // Replace the original exception with de-serialized one - exception = (EfSeederException)bf.Deserialize(ms); + exception = (Exception)bf.Deserialize(ms); } // Double-check that the exception message and stack trace (owned by the base Exception) are preserved diff --git a/src/EntityFramework.Seeder.EF6/Properties/AssemblyInfo.cs b/src/EntityFramework.Seeder.EF6/Properties/AssemblyInfo.cs index d516471..e29ad50 100644 --- a/src/EntityFramework.Seeder.EF6/Properties/AssemblyInfo.cs +++ b/src/EntityFramework.Seeder.EF6/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.1.0")] -[assembly: AssemblyFileVersion("0.3.1.0")] +[assembly: AssemblyVersion("0.3.2.0")] +[assembly: AssemblyFileVersion("0.3.2.0")] diff --git a/src/EntityFramework.Seeder.EF6/Seeder.cs b/src/EntityFramework.Seeder.EF6/Seeder.cs index 586d160..60d3a09 100644 --- a/src/EntityFramework.Seeder.EF6/Seeder.cs +++ b/src/EntityFramework.Seeder.EF6/Seeder.cs @@ -13,6 +13,22 @@ namespace EntityFramework.Seeder /// public static class Seeder { + static Seeder() + { + AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; + } + + private static Assembly ResolveAssembly(object sender, ResolveEventArgs args) + { + if (new AssemblyName(args.Name).Name == "EntityFramework.Seeder.EF6") + { + return typeof (Seeder).Assembly; + } + + return null; + + } + /// /// Seeds a DBSet from a CSV file that will be read from the specified stream /// @@ -45,9 +61,10 @@ public static void SeedFromStream(this IDbSet dbSet, Stream stream, Expres } catch (Exception ex) { - string message = string.Format("Error Seeding DbSet {0}: {1}", dbSet.GetType().Name, ex.Message); + string message = string.Format("Error Seeding DbSet<{0}>: {1}", dbSet.GetType().GenericTypeArguments[0].FullName, ex.ToString()); Exception innerException = ex.GetType().IsSerializable ? ex : null; - throw new EfSeederException(message, innerException); + //Unfortunately I need to use a root exception here as this is the only way for the Update-Database powershell script to properly report the error + throw new Exception(message, innerException); } }