From 1227c81b2382f5f137002efcec561588abec1f37 Mon Sep 17 00:00:00 2001 From: Jens Glad Balchen Date: Mon, 9 Aug 2021 18:31:07 +0200 Subject: [PATCH 1/2] Modified the overload of GetDynamicParameters that is used when a key is mapped so that it will properly ignore properties that are mapped using Map().Ignore(), --- .../Async/SqlServer/CrudFixture.cs | 11 +++++++++++ DapperExtensions/DapperImplementor.cs | 16 ++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/DapperExtensions.Test/IntegrationTests/Async/SqlServer/CrudFixture.cs b/DapperExtensions.Test/IntegrationTests/Async/SqlServer/CrudFixture.cs index 77d80dde..b1d7a2a5 100644 --- a/DapperExtensions.Test/IntegrationTests/Async/SqlServer/CrudFixture.cs +++ b/DapperExtensions.Test/IntegrationTests/Async/SqlServer/CrudFixture.cs @@ -13,6 +13,17 @@ namespace DapperExtensions.Test.IntegrationTests.Async.SqlServer [Parallelizable(ParallelScope.Self)] public static class CrudFixture { + [TestFixture] + public class InsertAsyncList : SqlServerBaseAsyncFixture + { + [Test] + public void InsertAsyncListWithIgnore() + { + var f = new Foo { FirstName = "Test", LastName = "Person", DateOfBirth = DateTime.Today }; + _ = Db.Insert(f).Result; + } + } + [TestFixture] public class InsertMethod : SqlServerBaseAsyncFixture { diff --git a/DapperExtensions/DapperImplementor.cs b/DapperExtensions/DapperImplementor.cs index cf4e1933..68d24e7e 100644 --- a/DapperExtensions/DapperImplementor.cs +++ b/DapperExtensions/DapperImplementor.cs @@ -557,12 +557,16 @@ public DynamicParameters GetDynamicParameters(IClassMapper classMap, T entity return GetDynamicParameters(entity, classMap, sequenceIdentityColumn, foreignKeys, ignored, useColumnAlias); } - public DynamicParameters GetDynamicParameters(T entity, DynamicParameters dynamicParameters, IMemberMap keyColumn, bool useColumnAlias = false) + public DynamicParameters GetDynamicParameters(IClassMapper classMap, T entity, IMemberMap keyColumn, bool useColumnAlias = false) { - dynamicParameters ??= new DynamicParameters(); - foreach (var prop in entity.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public) - .Where(p => p.Name != keyColumn.Name)) - AddParameter(entity, dynamicParameters, new MemberMap(prop), useColumnAlias); + var ignored = classMap.Properties.Where(x => x.Ignored).Select(p => p.MemberInfo).ToList(); + + var dynamicParameters = new DynamicParameters(); + + foreach (var prop in entity.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.GetField | BindingFlags.Instance | BindingFlags.Public) + .Where(p => p.Name != keyColumn.Name && !ignored.Contains(p) + )) + dynamicParameters = AddParameter(entity, dynamicParameters, new MemberMap(prop), useColumnAlias); return dynamicParameters; } @@ -695,7 +699,7 @@ protected dynamic InternalInsert(IDbConnection connection, T entity, IDbTrans var keyColumn = triggerIdentityColumn ?? identityColumn; object keyValue; - dynamicParameters = GetDynamicParameters(entity, dynamicParameters, keyColumn, true); + dynamicParameters = GetDynamicParameters(classMap, entity, keyColumn, true); if (triggerIdentityColumn != null) { From dc37b60d48a76f91fa898f7ccd86ebe9bd59eb0f Mon Sep 17 00:00:00 2001 From: Jens Glad Balchen Date: Mon, 9 Aug 2021 18:48:55 +0200 Subject: [PATCH 2/2] The critical piece of code to make the unit test for a List property fail (without the fix from the previous commit) --- .../IntegrationTests/Async/SqlServer/CrudFixture.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DapperExtensions.Test/IntegrationTests/Async/SqlServer/CrudFixture.cs b/DapperExtensions.Test/IntegrationTests/Async/SqlServer/CrudFixture.cs index b1d7a2a5..1d72f72d 100644 --- a/DapperExtensions.Test/IntegrationTests/Async/SqlServer/CrudFixture.cs +++ b/DapperExtensions.Test/IntegrationTests/Async/SqlServer/CrudFixture.cs @@ -19,7 +19,7 @@ public class InsertAsyncList : SqlServerBaseAsyncFixture [Test] public void InsertAsyncListWithIgnore() { - var f = new Foo { FirstName = "Test", LastName = "Person", DateOfBirth = DateTime.Today }; + var f = new Foo { FirstName = "Test", LastName = "Person", DateOfBirth = DateTime.Today, BarList = new List() { new Bar { Name = "BarTest" } } }; _ = Db.Insert(f).Result; } }