@@ -87,14 +87,14 @@ public void Test_EF_ComplexType()
8787 Assert . That ( evs [ 0 ] . Entries [ 0 ] . ColumnValues [ "Name" ] , Is . EqualTo ( "Development" ) ) ;
8888 Assert . That ( evs [ 1 ] . Entries [ 0 ] . ColumnValues [ "Name" ] , Is . EqualTo ( "New Name" ) ) ;
8989
90- Assert . That ( evs [ 0 ] . Entries [ 0 ] . ColumnValues [ "Address_City " ] , Is . EqualTo ( "*Vienna*" ) ) ;
91- Assert . That ( evs [ 1 ] . Entries [ 0 ] . ColumnValues [ "Address_City " ] , Is . EqualTo ( "*NewCity*" ) ) ;
90+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . ColumnValues [ "Address.City " ] , Is . EqualTo ( "*Vienna*" ) ) ;
91+ Assert . That ( evs [ 1 ] . Entries [ 0 ] . ColumnValues [ "Address.City " ] , Is . EqualTo ( "*NewCity*" ) ) ;
9292
93- Assert . That ( evs [ 0 ] . Entries [ 0 ] . ColumnValues [ "Address_Country_Alias " ] , Is . EqualTo ( "AU" ) ) ;
94- Assert . That ( evs [ 1 ] . Entries [ 0 ] . ColumnValues [ "Address_Country_Alias " ] , Is . EqualTo ( "NEWALIAS" ) ) ;
93+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . ColumnValues [ "Address.Country.Alias " ] , Is . EqualTo ( "AU" ) ) ;
94+ Assert . That ( evs [ 1 ] . Entries [ 0 ] . ColumnValues [ "Address.Country.Alias " ] , Is . EqualTo ( "NEWALIAS" ) ) ;
9595
96- Assert . That ( evs [ 1 ] . Entries [ 0 ] . Changes . FirstOrDefault ( ch => ch . ColumnName == "Address_Country_Alias " ) ? . OriginalValue , Is . EqualTo ( "AU" ) ) ;
97- Assert . That ( evs [ 1 ] . Entries [ 0 ] . Changes . FirstOrDefault ( ch => ch . ColumnName == "Address_Country_Alias " ) ? . NewValue , Is . EqualTo ( "NEWALIAS" ) ) ;
96+ Assert . That ( evs [ 1 ] . Entries [ 0 ] . Changes . FirstOrDefault ( ch => ch . ColumnName == "Address.Country.Alias " ) ? . OriginalValue , Is . EqualTo ( "AU" ) ) ;
97+ Assert . That ( evs [ 1 ] . Entries [ 0 ] . Changes . FirstOrDefault ( ch => ch . ColumnName == "Address.Country.Alias " ) ? . NewValue , Is . EqualTo ( "NEWALIAS" ) ) ;
9898
9999 context . Database . EnsureDeleted ( ) ;
100100 }
@@ -151,6 +151,95 @@ public void Test_EF_ComplexType_EntityFrameworkDataProvider_PropertyMatching()
151151 Assert . That ( auditLogs [ 0 ] . Address . Country . Alias , Is . EqualTo ( alias ) ) ;
152152 }
153153
154+ [ Test ]
155+ public void Test_EF_ComplexType_DuplicateLeafNames_ColumnValues ( )
156+ {
157+ using var context = new Context_ComplexTypes_DuplicateNames ( ) ;
158+ Audit . Core . Configuration . Setup ( )
159+ . UseInMemoryProvider ( out var dp ) ;
160+ Audit . EntityFramework . Configuration . Setup ( )
161+ . ForContext < Context_ComplexTypes_DuplicateNames > ( c => c . MapChangesByColumn ( ) ) ;
162+
163+ context . Database . EnsureDeleted ( ) ;
164+ context . Database . EnsureCreated ( ) ;
165+
166+ context . Loans . Add ( new Context_ComplexTypes_DuplicateNames . Loan ( )
167+ {
168+ Id = 1 ,
169+ LoanType = "FHA" ,
170+ LoanData = new Context_ComplexTypes_DuplicateNames . LoanData ( )
171+ {
172+ LoanType = "JsonFHA" ,
173+ PrimaryBorrower = new Context_ComplexTypes_DuplicateNames . BorrowerInfo ( ) { Email = "primary@example.com" } ,
174+ CoBorrower1 = new Context_ComplexTypes_DuplicateNames . BorrowerInfo ( ) { Email = "coborrower@example.com" }
175+ }
176+ } ) ;
177+
178+ Assert . DoesNotThrow ( ( ) => context . SaveChanges ( ) ) ;
179+
180+ var evs = dp . GetAllEventsOfType < AuditEventEntityFramework > ( ) . Select ( e => e . EntityFrameworkEvent ) . ToList ( ) ;
181+
182+ Assert . That ( evs . Count , Is . EqualTo ( 1 ) ) ;
183+ Assert . That ( evs [ 0 ] . Entries . Count , Is . EqualTo ( 1 ) ) ;
184+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . Action , Is . EqualTo ( "Insert" ) ) ;
185+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . ColumnValues [ "LoanType" ] , Is . EqualTo ( "FHA" ) ) ;
186+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . ColumnValues [ "LoanData.LoanType" ] , Is . EqualTo ( "JsonFHA" ) ) ;
187+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . ColumnValues [ "LoanData.PrimaryBorrower.Email" ] , Is . EqualTo ( "primary@example.com" ) ) ;
188+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . ColumnValues [ "LoanData.CoBorrower1.Email" ] , Is . EqualTo ( "coborrower@example.com" ) ) ;
189+
190+ context . Database . EnsureDeleted ( ) ;
191+ }
192+
193+ [ Test ]
194+ public void Test_EF_ComplexType_DuplicateLeafNames_Changes ( )
195+ {
196+ using var context = new Context_ComplexTypes_DuplicateNames ( ) ;
197+ context . AuditDisabled = true ;
198+ Audit . Core . Configuration . Setup ( )
199+ . UseInMemoryProvider ( out var dp ) ;
200+
201+ context . Database . EnsureDeleted ( ) ;
202+ context . Database . EnsureCreated ( ) ;
203+
204+ var loan = new Context_ComplexTypes_DuplicateNames . Loan ( )
205+ {
206+ Id = 1 ,
207+ LoanType = "FHA" ,
208+ LoanData = new Context_ComplexTypes_DuplicateNames . LoanData ( )
209+ {
210+ LoanType = "JsonFHA" ,
211+ PrimaryBorrower = new Context_ComplexTypes_DuplicateNames . BorrowerInfo ( ) { Email = "primary@example.com" } ,
212+ CoBorrower1 = new Context_ComplexTypes_DuplicateNames . BorrowerInfo ( ) { Email = "coborrower@example.com" }
213+ }
214+ } ;
215+
216+ context . Loans . Add ( loan ) ;
217+ context . SaveChanges ( ) ;
218+ context . AuditDisabled = false ;
219+
220+ loan . LoanType = "VA" ;
221+ loan . LoanData = loan . LoanData with
222+ {
223+ LoanType = "JsonVA" ,
224+ PrimaryBorrower = loan . LoanData . PrimaryBorrower with { Email = "updated-primary@example.com" } ,
225+ CoBorrower1 = loan . LoanData . CoBorrower1 with { Email = "updated-coborrower@example.com" }
226+ } ;
227+
228+ Assert . DoesNotThrow ( ( ) => context . SaveChanges ( ) ) ;
229+
230+ var evs = dp . GetAllEventsOfType < AuditEventEntityFramework > ( ) . Select ( e => e . EntityFrameworkEvent ) . ToList ( ) ;
231+
232+ Assert . That ( evs . Count , Is . EqualTo ( 1 ) ) ;
233+ Assert . That ( evs [ 0 ] . Entries . Count , Is . EqualTo ( 1 ) ) ;
234+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . Action , Is . EqualTo ( "Update" ) ) ;
235+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . Changes . Any ( ch => ch . ColumnName == "LoanType" && ( string ) ch . OriginalValue == "FHA" && ( string ) ch . NewValue == "VA" ) , Is . True ) ;
236+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . Changes . Any ( ch => ch . ColumnName == "LoanData.LoanType" && ( string ) ch . OriginalValue == "JsonFHA" && ( string ) ch . NewValue == "JsonVA" ) , Is . True ) ;
237+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . Changes . Any ( ch => ch . ColumnName == "LoanData.PrimaryBorrower.Email" && ( string ) ch . OriginalValue == "primary@example.com" && ( string ) ch . NewValue == "updated-primary@example.com" ) , Is . True ) ;
238+ Assert . That ( evs [ 0 ] . Entries [ 0 ] . Changes . Any ( ch => ch . ColumnName == "LoanData.CoBorrower1.Email" && ( string ) ch . OriginalValue == "coborrower@example.com" && ( string ) ch . NewValue == "updated-coborrower@example.com" ) , Is . True ) ;
239+
240+ context . Database . EnsureDeleted ( ) ;
241+ }
242+
154243#endif
155244
156245#if EF_CORE_5_OR_GREATER
0 commit comments