diff --git a/Source/EntityFramework.Extended/Audit/AuditLogger.cs b/Source/EntityFramework.Extended/Audit/AuditLogger.cs index 2809f56..9a24663 100644 --- a/Source/EntityFramework.Extended/Audit/AuditLogger.cs +++ b/Source/EntityFramework.Extended/Audit/AuditLogger.cs @@ -188,7 +188,6 @@ private bool WriteEntity(AuditEntryState state) WriteRelationships(state); return true; - } private void WriteKeys(AuditEntryState state) @@ -360,13 +359,14 @@ private void WriteRelationships(AuditEntryState state) auditProperty.IsRelationship = true; auditProperty.ForeignKey = GetForeignKey(navigationProperty); - object currentValue; + object currentValue = null; if (isLoaded) { // get value directly from instance to save db call object valueInstance = accessor.GetValue(state.Entity); - currentValue = displayMember.GetValue(valueInstance); + if(valueInstance != null) + currentValue = displayMember.GetValue(valueInstance); } else { diff --git a/Source/Samples/net45/Tracker.SqlServer.Test/AuditTest.cs b/Source/Samples/net45/Tracker.SqlServer.Test/AuditTest.cs index 779b249..cbda069 100644 --- a/Source/Samples/net45/Tracker.SqlServer.Test/AuditTest.cs +++ b/Source/Samples/net45/Tracker.SqlServer.Test/AuditTest.cs @@ -1,4 +1,5 @@ using System; +using System.Data.Entity.Core.Objects.DataClasses; using System.Data.Entity.Infrastructure; using System.IO; using System.Linq; @@ -13,6 +14,7 @@ using NUnit.Framework; using Tracker.SqlServer.CodeFirst; using Tracker.SqlServer.CodeFirst.Entities; +using System.Data.Entity; namespace Tracker.SqlServer.Test { @@ -634,6 +636,51 @@ public void LogWithNullableRelations() tran.Rollback(); } + [Test] + public void LogWithNullableRelationWithoutValueAndAllreadyLoadedRelation() + { + var auditConfiguration = AuditConfiguration.Default; + + auditConfiguration.IncludeRelationships = true; + auditConfiguration.LoadRelationships = true; + auditConfiguration.DefaultAuditable = true; + auditConfiguration.MaintainAcrossSaves = false; + + auditConfiguration.IsAuditable(); + auditConfiguration.IsAuditable().DisplayMember(t => t.Name); + + var db = new TrackerContext(); + var tran = db.BeginTransaction(); + var audit = db.BeginAudit(); + + var task = new Task() + { + AssignedId = 1, + StatusId = 1, + Priority = null, + Summary = "Summary: " + DateTime.Now.Ticks, + CreatedId = 1, + CreatedDate = DateTime.Now, + ModifiedDate = DateTime.Now, + }; + db.Tasks.Add(task); + + var entries = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added); + var relation = entries.First().RelationshipManager.GetRelatedReference("Tracker.SqlServer.CodeFirst.Task_Priority", "Task_Priority_Target"); + relation.Load(); + + db.SaveChanges(); + + foreach (var property in audit.LastLog.Entities.SelectMany(e => e.Properties)) + { + Assert.AreNotEqual(property.Current, "{error}"); + Assert.AreNotEqual(property.Original, "{error}"); + } + + //undo work + tran.Rollback(); + } + public static object FormatStatus(AuditPropertyContext auditProperty) { Console.WriteLine("FormatStatus: {0}", auditProperty.Value);