diff --git a/CHANGELOG.md b/CHANGELOG.md
index a4a09ef9..b88ab7de 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,10 @@ All notable changes to Audit.NET and its extensions will be documented in this f
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
+## [13.2.2] - 2018-11-15
+### Modified
+- Audit.EntityFramework.Core: Fix bug when auditing tables with composite multiple froeign keys related to the same column (#178).
+
## [13.2.1] - 2018-11-12
### Modified
- Audit.EntityFramework and Audit.EntityFramework.Core: Fix parameter default for `IgnoreMatchedProperties(bool)` on configuration API to be _true_.
diff --git a/src/Audit.DynamicProxy/Audit.DynamicProxy.csproj b/src/Audit.DynamicProxy/Audit.DynamicProxy.csproj
index 76622a3c..00ca8771 100644
--- a/src/Audit.DynamicProxy/Audit.DynamicProxy.csproj
+++ b/src/Audit.DynamicProxy/Audit.DynamicProxy.csproj
@@ -4,7 +4,7 @@
Generate Audit Logs by intercepting operation calls on any class without changing its code.
Copyright 2016
Audit.DynamicProxy
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.5;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.EntityFramework.Core/Audit.EntityFramework.Core.csproj b/src/Audit.EntityFramework.Core/Audit.EntityFramework.Core.csproj
index e969e7a1..cbf518c7 100644
--- a/src/Audit.EntityFramework.Core/Audit.EntityFramework.Core.csproj
+++ b/src/Audit.EntityFramework.Core/Audit.EntityFramework.Core.csproj
@@ -4,7 +4,7 @@
Generate Audit Logs from EntityFramework context changes
Copyright 2016
Audit.EntityFramework.Core
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.5;netstandard2.0;net461
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.EntityFramework.Identity.Core/Audit.EntityFramework.Identity.Core.csproj b/src/Audit.EntityFramework.Identity.Core/Audit.EntityFramework.Identity.Core.csproj
index 40c26880..e5fece8d 100644
--- a/src/Audit.EntityFramework.Identity.Core/Audit.EntityFramework.Identity.Core.csproj
+++ b/src/Audit.EntityFramework.Identity.Core/Audit.EntityFramework.Identity.Core.csproj
@@ -4,7 +4,7 @@
Generate Audit Logs from EntityFramework identity context changes
Copyright 2018
Audit.EntityFramework.Identity.Core
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.5;netstandard2.0;net461
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.EntityFramework.Identity/Audit.EntityFramework.Identity.csproj b/src/Audit.EntityFramework.Identity/Audit.EntityFramework.Identity.csproj
index f8c21167..fc35091a 100644
--- a/src/Audit.EntityFramework.Identity/Audit.EntityFramework.Identity.csproj
+++ b/src/Audit.EntityFramework.Identity/Audit.EntityFramework.Identity.csproj
@@ -4,7 +4,7 @@
Generate Audit Logs from EntityFramework identity context changes
Copyright 2018
Audit.EntityFramework.Identity
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.5;netstandard2.0;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.EntityFramework/Audit.EntityFramework.csproj b/src/Audit.EntityFramework/Audit.EntityFramework.csproj
index f18d512a..13f1dd10 100644
--- a/src/Audit.EntityFramework/Audit.EntityFramework.csproj
+++ b/src/Audit.EntityFramework/Audit.EntityFramework.csproj
@@ -4,7 +4,7 @@
Generate Audit Logs from EntityFramework context changes
Copyright 2016
Audit.EntityFramework
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.5;netstandard2.0;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.EntityFramework/DbContextHelper.Core.cs b/src/Audit.EntityFramework/DbContextHelper.Core.cs
index 62c3b4d5..9205d53b 100644
--- a/src/Audit.EntityFramework/DbContextHelper.Core.cs
+++ b/src/Audit.EntityFramework/DbContextHelper.Core.cs
@@ -175,7 +175,7 @@ private static IEntityType GetDefiningType(DbContext dbContext, EntityEntry entr
{
foreach (var prop in fk.Properties)
{
- result.Add(GetColumnName(prop), entry.Property(prop.Name).CurrentValue);
+ result[GetColumnName(prop)] = entry.Property(prop.Name).CurrentValue;
}
}
}
diff --git a/src/Audit.FileSystem/Audit.FileSystem.csproj b/src/Audit.FileSystem/Audit.FileSystem.csproj
index 90e7f092..c656bc1a 100644
--- a/src/Audit.FileSystem/Audit.FileSystem.csproj
+++ b/src/Audit.FileSystem/Audit.FileSystem.csproj
@@ -4,7 +4,7 @@
Generate Audit Logs from file system events using a FileSystemWatcher
Copyright 2018
Audit.FileSystem
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.3;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.Mvc.Core/Audit.Mvc.Core.csproj b/src/Audit.Mvc.Core/Audit.Mvc.Core.csproj
index 7405f1d1..05f7679f 100644
--- a/src/Audit.Mvc.Core/Audit.Mvc.Core.csproj
+++ b/src/Audit.Mvc.Core/Audit.Mvc.Core.csproj
@@ -4,7 +4,7 @@
Generate detailed Audit Logs for AspNet Core MVC Controller actions.
Copyright 2016
Audit.Mvc.Core
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.6;netstandard2.0;net451
TRACE;DEBUG;STRONG_NAME
diff --git a/src/Audit.Mvc/Audit.Mvc.csproj b/src/Audit.Mvc/Audit.Mvc.csproj
index 33d8977f..e0638a01 100644
--- a/src/Audit.Mvc/Audit.Mvc.csproj
+++ b/src/Audit.Mvc/Audit.Mvc.csproj
@@ -4,7 +4,7 @@
Generate detailed Audit Logs for MVC Controller actions.
Copyright 2016
Audit.Mvc
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.6;netstandard2.0;net45
TRACE;DEBUG;STRONG_NAME
diff --git a/src/Audit.NET.AzureDocumentDB/Audit.NET.AzureDocumentDB.csproj b/src/Audit.NET.AzureDocumentDB/Audit.NET.AzureDocumentDB.csproj
index 39878352..58bafce8 100644
--- a/src/Audit.NET.AzureDocumentDB/Audit.NET.AzureDocumentDB.csproj
+++ b/src/Audit.NET.AzureDocumentDB/Audit.NET.AzureDocumentDB.csproj
@@ -4,7 +4,7 @@
Store Audit.NET Trail Logs into an Azure Document DB database
Copyright 2016
Audit.AzureDocumentDB
- 13.2.1
+ 13.2.2
Federico Colombo
net45;netstandard1.6;netstandard2.0
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.AzureStorage/Audit.NET.AzureStorage.csproj b/src/Audit.NET.AzureStorage/Audit.NET.AzureStorage.csproj
index 1bdcba83..e2ffe3a7 100644
--- a/src/Audit.NET.AzureStorage/Audit.NET.AzureStorage.csproj
+++ b/src/Audit.NET.AzureStorage/Audit.NET.AzureStorage.csproj
@@ -4,7 +4,7 @@
Store Audit.NET Logs into an Azure Blob Storage
Copyright 2016
Audit.AzureStorage
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.3;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.DynamoDB/Audit.NET.DynamoDB.csproj b/src/Audit.NET.DynamoDB/Audit.NET.DynamoDB.csproj
index 513ede7d..65b42bd7 100644
--- a/src/Audit.NET.DynamoDB/Audit.NET.DynamoDB.csproj
+++ b/src/Audit.NET.DynamoDB/Audit.NET.DynamoDB.csproj
@@ -4,7 +4,7 @@
Store Audit.NET Trail Logs into Amazon DynamoDB
Copyright 2018
Audit.DynamoDB
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.3;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.ElasticSearch/Audit.NET.Elasticsearch.csproj b/src/Audit.NET.ElasticSearch/Audit.NET.Elasticsearch.csproj
index f8f87f16..c3c19603 100644
--- a/src/Audit.NET.ElasticSearch/Audit.NET.Elasticsearch.csproj
+++ b/src/Audit.NET.ElasticSearch/Audit.NET.Elasticsearch.csproj
@@ -4,7 +4,7 @@
Store Audit.NET Trail Logs into Elasticsearch database
Copyright 2018
Audit.Elasticsearch
- 13.2.1
+ 13.2.2
Federico Colombo
net451;netstandard1.3
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.EventLog.Core/Audit.NET.EventLog.Core.csproj b/src/Audit.NET.EventLog.Core/Audit.NET.EventLog.Core.csproj
index 2266877b..6f6b7fc9 100644
--- a/src/Audit.NET.EventLog.Core/Audit.NET.EventLog.Core.csproj
+++ b/src/Audit.NET.EventLog.Core/Audit.NET.EventLog.Core.csproj
@@ -4,7 +4,7 @@
Log Audit.NET events to the Windows EventLog when targeting net standard 2.0
Copyright 2018
Audit.NET.EventLog.Core
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard2.0
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.MongoDB/Audit.NET.MongoDB.csproj b/src/Audit.NET.MongoDB/Audit.NET.MongoDB.csproj
index b99c5f3d..dd9e97fb 100644
--- a/src/Audit.NET.MongoDB/Audit.NET.MongoDB.csproj
+++ b/src/Audit.NET.MongoDB/Audit.NET.MongoDB.csproj
@@ -4,7 +4,7 @@
Store Audit.NET Trail Logs into a MongoDB database
Copyright 2016
Audit.MongoDB
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.5;net45
$(NoWarn);1591
diff --git a/src/Audit.NET.MySql/Audit.NET.MySql.csproj b/src/Audit.NET.MySql/Audit.NET.MySql.csproj
index 5394b4f3..e374fb77 100644
--- a/src/Audit.NET.MySql/Audit.NET.MySql.csproj
+++ b/src/Audit.NET.MySql/Audit.NET.MySql.csproj
@@ -4,7 +4,7 @@
Store Audit.NET Trail Logs into a MySQL database
Copyright 2016
Audit.MySql
- 13.2.1
+ 13.2.2
Federico Colombo
netcoreapp1.0;net451
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.PostgreSql/Audit.NET.PostgreSql.csproj b/src/Audit.NET.PostgreSql/Audit.NET.PostgreSql.csproj
index 5c536064..5ce6a1c1 100644
--- a/src/Audit.NET.PostgreSql/Audit.NET.PostgreSql.csproj
+++ b/src/Audit.NET.PostgreSql/Audit.NET.PostgreSql.csproj
@@ -3,7 +3,7 @@
Store Audit.NET Trail Logs into a PostgreSQL database
Copyright 2017
Audit.PostgreSql
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard2.0;netstandard1.3;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.Redis/Audit.NET.Redis.csproj b/src/Audit.NET.Redis/Audit.NET.Redis.csproj
index cf48579a..531449cd 100644
--- a/src/Audit.NET.Redis/Audit.NET.Redis.csproj
+++ b/src/Audit.NET.Redis/Audit.NET.Redis.csproj
@@ -4,7 +4,7 @@
Store Audit.NET Trail Logs in a Redis database as a strings, lists, hashes, sortedsets or pubsub
Copyright 2017
Audit.Redis
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.5;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.SqlServer/Audit.NET.SqlServer.csproj b/src/Audit.NET.SqlServer/Audit.NET.SqlServer.csproj
index dc57865d..f3498e0f 100644
--- a/src/Audit.NET.SqlServer/Audit.NET.SqlServer.csproj
+++ b/src/Audit.NET.SqlServer/Audit.NET.SqlServer.csproj
@@ -4,7 +4,7 @@
Store Audit.NET Trail Logs into a SQL Server database
Copyright 2016
Audit.SqlServer
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard2.0;netstandard1.3;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.Udp/Audit.NET.Udp.csproj b/src/Audit.NET.Udp/Audit.NET.Udp.csproj
index c0f0906a..fa013049 100644
--- a/src/Audit.NET.Udp/Audit.NET.Udp.csproj
+++ b/src/Audit.NET.Udp/Audit.NET.Udp.csproj
@@ -4,7 +4,7 @@
Send Audit.NET Trail Logs as connectionless UDP datagrams to a remote host or a multicast group
Copyright 2017
Audit.Udp
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.3;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET.log4net/Audit.NET.log4net.csproj b/src/Audit.NET.log4net/Audit.NET.log4net.csproj
index bf2cd497..2a114b60 100644
--- a/src/Audit.NET.log4net/Audit.NET.log4net.csproj
+++ b/src/Audit.NET.log4net/Audit.NET.log4net.csproj
@@ -4,7 +4,7 @@
Log Audit.NET Audit Trail using Apache log4net™
Copyright 2017
Audit.log4net
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.3;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.NET/Audit.NET.csproj b/src/Audit.NET/Audit.NET.csproj
index f5e2815c..48e25f0a 100644
--- a/src/Audit.NET/Audit.NET.csproj
+++ b/src/Audit.NET/Audit.NET.csproj
@@ -3,7 +3,7 @@
An extensible framework to audit executing operations in .NET and .NET Core.
Copyright 2016
Audit.NET
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.3;netstandard2.0;net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.SignalR/Audit.SignalR.csproj b/src/Audit.SignalR/Audit.SignalR.csproj
index c5cb48dd..c17db731 100644
--- a/src/Audit.SignalR/Audit.SignalR.csproj
+++ b/src/Audit.SignalR/Audit.SignalR.csproj
@@ -3,7 +3,7 @@
Generate Audit Logs for ASP.NET SignalR invokations
Copyright 2016
Audit.SignalR
- 13.2.1
+ 13.2.2
Federico Colombo
net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.WCF/Audit.WCF.csproj b/src/Audit.WCF/Audit.WCF.csproj
index 562d3fa8..456ccfda 100644
--- a/src/Audit.WCF/Audit.WCF.csproj
+++ b/src/Audit.WCF/Audit.WCF.csproj
@@ -4,7 +4,7 @@
Generate detailed Audit Logs for WCF service calls.
Copyright 2016
Audit.Wcf
- 13.2.1
+ 13.2.2
Federico Colombo
net45
$(DefineConstants);STRONG_NAME
diff --git a/src/Audit.WebApi.Core/Audit.WebApi.Core.csproj b/src/Audit.WebApi.Core/Audit.WebApi.Core.csproj
index b9112858..3b305f68 100644
--- a/src/Audit.WebApi.Core/Audit.WebApi.Core.csproj
+++ b/src/Audit.WebApi.Core/Audit.WebApi.Core.csproj
@@ -4,7 +4,7 @@
Generate detailed Audit Logs for AspNet Core Web API Controller calls.
Copyright 2016
Audit.WebApi.Core
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.6;netstandard2.0;net451
TRACE;DEBUG;STRONG_NAME
diff --git a/src/Audit.WebApi/Audit.WebApi.csproj b/src/Audit.WebApi/Audit.WebApi.csproj
index 9c2dd6eb..4f0b3ff3 100644
--- a/src/Audit.WebApi/Audit.WebApi.csproj
+++ b/src/Audit.WebApi/Audit.WebApi.csproj
@@ -4,7 +4,7 @@
Generate detailed Audit Logs for Web API Controller calls.
Copyright 2016
Audit.WebApi
- 13.2.1
+ 13.2.2
Federico Colombo
netstandard1.6;netstandard2.0;net45
TRACE;DEBUG;STRONG_NAME
diff --git a/test/Audit.EntityFramework.Core.UnitTest/Demo.sql b/test/Audit.EntityFramework.Core.UnitTest/Demo.sql
new file mode 100644
index 00000000..31e51e7b
--- /dev/null
+++ b/test/Audit.EntityFramework.Core.UnitTest/Demo.sql
@@ -0,0 +1,59 @@
+CREATE DATABASE Demo
+GO
+USE [Demo]
+GO
+
+CREATE TABLE [dbo].[Tenant](
+[Id] [int] NOT NULL,
+[Name] varchar(100) NOT NULL,
+CONSTRAINT [PK_Tenant] PRIMARY KEY CLUSTERED
+(
+[Id] ASC
+)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[Employee](
+[Id] [int] NOT NULL,
+[TenantId] [int] NOT NULL,
+[Name] varchar(100) NOT NULL,
+CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED
+(
+[Id] ASC,
+[TenantId] ASC
+)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[Employee] WITH CHECK ADD CONSTRAINT [FK_Employee_Tenant] FOREIGN KEY([TenantId])
+REFERENCES [dbo].[Tenant] ([Id])
+GO
+
+ALTER TABLE [dbo].[Employee] CHECK CONSTRAINT [FK_Employee_Tenant]
+GO
+
+CREATE TABLE [dbo].[PettyCashTransaction](
+[Id] [int] NOT NULL,
+[EmployeeId] [int] NULL,
+[TrusteeId] [int] NULL,
+[TenantId] [int] NULL,
+CONSTRAINT [PK_PettyCashTransaction] PRIMARY KEY CLUSTERED
+(
+[Id] ASC
+)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[PettyCashTransaction] WITH CHECK ADD CONSTRAINT [FK_PettyCashTransaction_Employee] FOREIGN KEY([EmployeeId], [TenantId])
+REFERENCES [dbo].[Employee] ([Id], [TenantId])
+GO
+
+ALTER TABLE [dbo].[PettyCashTransaction] CHECK CONSTRAINT [FK_PettyCashTransaction_Employee]
+GO
+
+ALTER TABLE [dbo].[PettyCashTransaction] WITH CHECK ADD CONSTRAINT [FK_PettyCashTransaction_EmployeeTrustee] FOREIGN KEY([TrusteeId], [TenantId])
+REFERENCES [dbo].[Employee] ([Id], [TenantId])
+GO
+
+ALTER TABLE [dbo].[PettyCashTransaction] CHECK CONSTRAINT [FK_PettyCashTransaction_EmployeeTrustee]
+GO
\ No newline at end of file
diff --git a/test/Audit.EntityFramework.Core.UnitTest/DemoContext.cs b/test/Audit.EntityFramework.Core.UnitTest/DemoContext.cs
new file mode 100644
index 00000000..f38e8391
--- /dev/null
+++ b/test/Audit.EntityFramework.Core.UnitTest/DemoContext.cs
@@ -0,0 +1,71 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+
+namespace Audit.EntityFramework.Core.UnitTest
+{
+ public class DemoContext : AuditDbContext
+ {
+ public const string CnnString = "data source=localhost;initial catalog=Demo;integrated security=true;";
+
+ public DbSet Tenants { get; set; }
+ public DbSet Employees { get; set; }
+ public DbSet Pettys { get; set; }
+
+ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
+ {
+ optionsBuilder.UseSqlServer(CnnString);
+ optionsBuilder.EnableSensitiveDataLogging();
+ }
+
+ protected override void OnModelCreating(ModelBuilder _)
+ {
+ _.Entity().ToTable("Tenant");
+ _.Entity().ToTable("Employee");
+ _.Entity().ToTable("PettyCashTransaction");
+
+ _.Entity()
+ .HasKey(t => t.Id);
+
+ _.Entity()
+ .HasKey(t => new { t.Id, t.TenantId });
+
+ _.Entity()
+ .HasKey(t => new { t.Id });
+
+ _.Entity()
+ .HasOne(t => t.Employee)
+ .WithMany()
+ .HasForeignKey(t => new { t.EmployeeId, t.TenantId });
+
+ _.Entity()
+ .HasOne(t => t.Trustee)
+ .WithMany()
+ .HasForeignKey(t => new { t.TrusteeId, t.TenantId });
+ }
+ }
+
+ public class Tenant
+ {
+ public int Id { get; set; }
+ public string Name { get; set; }
+ }
+ public class Employee
+ {
+ public int Id { get; set; }
+ public int TenantId { get; set; }
+ public string Name { get; set; }
+ }
+ public class PettyCashTransaction
+ {
+ public int Id { get; set; }
+ public int EmployeeId { get; set; }
+ public int TrusteeId { get; set; }
+ public int TenantId { get; set; }
+
+ public Employee Employee { get; set; }
+ public Employee Trustee { get; set; }
+ }
+}
diff --git a/test/Audit.EntityFramework.Core.UnitTest/EfCore21Tests.cs b/test/Audit.EntityFramework.Core.UnitTest/EfCore21Tests.cs
index b0fb6f0b..a77f8839 100644
--- a/test/Audit.EntityFramework.Core.UnitTest/EfCore21Tests.cs
+++ b/test/Audit.EntityFramework.Core.UnitTest/EfCore21Tests.cs
@@ -26,6 +26,80 @@ public void Setup()
new BlogsContext().Database.EnsureCreated();
}
+ [Test]
+ public void Test_EF_CompositeRepeatedForeignKey()
+ {
+ // Issue #178
+ var events = new List();
+ Audit.Core.Configuration.Setup()
+ .UseDynamicProvider(_ => _.OnInsertAndReplace(ev =>
+ {
+ events.Add(ev.GetEntityFrameworkEvent());
+ }));
+ Audit.EntityFramework.Configuration.Setup()
+ .ForContext(cfg => cfg.IncludeEntityObjects());
+
+ var id = new Random().Next();
+
+ using (var ctx = new DemoContext())
+ {
+ var tenant = new Tenant() { Id = id, Name = "tenant" };
+ ctx.Tenants.Add(tenant);
+
+ ctx.SaveChanges();
+
+ var employee1 = new Employee() { Id = id + 1, Name = "test1", TenantId = tenant.Id };
+ ctx.Employees.Add(employee1);
+ var employee2 = new Employee() { Id = id + 2, Name = "test2", TenantId = tenant.Id };
+ ctx.Employees.Add(employee2);
+
+ ctx.SaveChanges();
+
+ var petty = new PettyCashTransaction() { Id = id + 3, EmployeeId = employee1.Id, TenantId = tenant.Id, TrusteeId = employee2.Id };
+ ctx.Pettys.Add(petty);
+ ctx.SaveChanges();
+
+ var emp = ctx.Employees.Single(x => x.Id == employee1.Id);
+ emp.Name = $"test1-updated";
+ ctx.SaveChanges();
+ }
+
+ Assert.AreEqual(4, events.Count);
+ Assert.AreEqual(1, events[0].Entries.Count);
+ Assert.AreEqual(id, events[0].Entries[0].ColumnValues["Id"]);
+ Assert.AreEqual("tenant", events[0].Entries[0].ColumnValues["Name"]);
+ Assert.AreEqual(id, events[0].Entries[0].PrimaryKey["Id"]);
+
+ Assert.AreEqual(2, events[1].Entries.Count);
+ Assert.AreEqual(id+1, events[1].Entries[0].ColumnValues["Id"]);
+ Assert.AreEqual("test1", events[1].Entries[0].ColumnValues["Name"]);
+ Assert.AreEqual(id, events[1].Entries[0].ColumnValues["TenantId"]);
+ Assert.AreEqual(2, events[1].Entries[0].PrimaryKey.Count);
+ Assert.AreEqual(id+1, events[1].Entries[0].PrimaryKey["Id"]);
+ Assert.AreEqual(id, events[1].Entries[0].PrimaryKey["TenantId"]);
+
+ Assert.AreEqual(id + 2, events[1].Entries[1].ColumnValues["Id"]);
+ Assert.AreEqual("test2", events[1].Entries[1].ColumnValues["Name"]);
+ Assert.AreEqual(id, events[1].Entries[1].ColumnValues["TenantId"]);
+ Assert.AreEqual(2, events[1].Entries[1].PrimaryKey.Count);
+ Assert.AreEqual(id + 2, events[1].Entries[1].PrimaryKey["Id"]);
+ Assert.AreEqual(id, events[1].Entries[1].PrimaryKey["TenantId"]);
+
+ Assert.AreEqual(1, events[2].Entries.Count);
+ Assert.AreEqual(id + 3, events[2].Entries[0].ColumnValues["Id"]);
+ Assert.AreEqual(id + 1, events[2].Entries[0].ColumnValues["EmployeeId"]);
+ Assert.AreEqual(id, events[2].Entries[0].ColumnValues["TenantId"]);
+ Assert.AreEqual(id + 2, events[2].Entries[0].ColumnValues["TrusteeId"]);
+ Assert.AreEqual(id + 3, events[2].Entries[0].PrimaryKey["Id"]);
+
+ Assert.AreEqual(1, events[3].Entries.Count);
+ Assert.AreEqual(1, events[3].Entries[0].Changes.Count);
+ Assert.AreEqual("Name", events[3].Entries[0].Changes[0].ColumnName);
+ Assert.AreEqual("test1", events[3].Entries[0].Changes[0].OriginalValue);
+ Assert.AreEqual("test1-updated", events[3].Entries[0].Changes[0].NewValue);
+
+ }
+
[Test]
public void Test_EF_MapMultipleTypesToSameAuditType()
{
diff --git a/test/test.bat b/test/test.bat
deleted file mode 100644
index aef5b101..00000000
--- a/test/test.bat
+++ /dev/null
@@ -1,92 +0,0 @@
-@echo off
-start "" "D:\Program Files\MongoDB\Server\3.4\bin\mongod.exe"
-start "" /D c:\redis "c:\redis\redis-server.exe"
-net start mysql57
-net start mssqlserver
-net start postgresql-x64-9.6
-net start elasticsearch
-
-cd ..
-dotnet restore
-cd test
-
-cd Audit.Mvc.UnitTest
-dotnet test --logger:"console;verbosity=normal"
-echo continue...
-pause > nul
-echo Running...
-
-cd ..
-
-cd Audit.UnitTest
-dotnet test --logger:"console;verbosity=normal"
-echo continue...
-pause > nul
-echo Running...
-cd ..
-
-cd Audit.WebApi.UnitTest
-dotnet test --logger:"console;verbosity=normal"
-echo continue...
-pause > nul
-echo Running...
-
-cd ..
-
-cd Audit.DynamicProxy.UnitTest
-dotnet test --logger:"console;verbosity=normal"
-echo continue...
-pause > nul
-echo Running...
-cd ..
-
-cd Audit.EntityFramework.Core.UnitTest
-dotnet test --logger:"console;verbosity=normal"
-
-echo Running...
-cd ..
-
-cd Audit.EntityFramework.UnitTest
-"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe"
-..\..\packages\NUnit.ConsoleRunner.3.7.0\tools\nunit3-console.exe bin\Debug\Audit.EntityFramework.UnitTest.dll --noresult --where=cat=Sql
-..\..\packages\NUnit.ConsoleRunner.3.7.0\tools\nunit3-console.exe bin\Debug\Audit.EntityFramework.UnitTest.dll --noresult --where=cat=LocalDb
-..\..\packages\NUnit.ConsoleRunner.3.7.0\tools\nunit3-console.exe bin\Debug\Audit.EntityFramework.UnitTest.dll --noresult --where=cat=Stress
-echo continue...
-pause > nul
-echo Running...
-cd ..
-
-cd Audit.Redis.UnitTest
-dotnet test --logger:"console;verbosity=normal"
-echo continue...
-pause > nul
-echo Running...
-cd ..
-
-cd Audit.Integration.AspNetCore
-dotnet run
-echo continue...
-pause > nul
-cd ..
-
-cd Audit.IntegrationTest
-
-dotnet test --logger:"console;verbosity=normal" --filter "TestCategory!=AzureDocDb&TestCategory!=AzureBlob&TestCategory!=WCF&TestCategory!=Elasticsearch&TestCategory!=Dynamo"
-dotnet test --logger:"console;verbosity=normal" --filter "TestCategory=AzureDocDb"
-dotnet test --logger:"console;verbosity=normal" --filter "TestCategory=AzureBlob"
-dotnet test --logger:"console;verbosity=normal" -f net451 --filter "TestCategory=WCF&TestCategory!=Async"
-dotnet test --logger:"console;verbosity=normal" -f net451 --filter "TestCategory=WCF&TestCategory=Async"
-dotnet test --logger:"console;verbosity=normal" --filter "TestCategory=Elasticsearch"
-dotnet test --logger:"console;verbosity=normal" --filter "TestCategory=Dynamo"
-echo continue...
-pause > nul
-cd ..
-
-del TestResult.xml /s
-
-net stop mssqlserver
-net stop mysql57
-net stop postgresql-x64-9.6
-net stop elasticsearch
-taskkill /f /im mongod.exe
-taskkill /f /im redis-server.exe
\ No newline at end of file
diff --git a/test/testns.bat b/test/testns.bat
index 2365580e..0564720d 100644
--- a/test/testns.bat
+++ b/test/testns.bat
@@ -1,4 +1,5 @@
@echo off
+start "" /D D:\DynamoDB "D:\DynamoDB\run.bat"
start "" "D:\Program Files\MongoDB\Server\3.4\bin\mongod.exe"
start "" /D c:\redis "c:\redis\redis-server.exe"
net start mysql57