diff --git a/framework/src/Bing.Datas.EntityFramework/Logs/EfLog.cs b/framework/src/Bing.Datas.EntityFramework/Logs/EfLog.cs index 4ae24bfab..017081b70 100644 --- a/framework/src/Bing.Datas.EntityFramework/Logs/EfLog.cs +++ b/framework/src/Bing.Datas.EntityFramework/Logs/EfLog.cs @@ -7,6 +7,7 @@ using Bing.Extensions; using Bing.Helpers; using Bing.Logs; +using Bing.Reflection; using Bing.Uow; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Logging; @@ -37,6 +38,7 @@ public class EfLog : ILogger public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { + var success = false; var config = GetConfig(); var log = GetUnitOfWork()?.Log; if (log == null) @@ -46,13 +48,31 @@ public void Log(LogLevel logLevel, EventId eventId, TState state, Except if (!string.IsNullOrWhiteSpace(GetUnitOfWork().TraceId)) log.Tag(GetUnitOfWork()?.TraceId); log.Tag(TraceLogName); - log - .Caption($"执行EF操作:{formatter(state, exception)}") - .Content($"工作单元跟踪号:{GetUnitOfWork()?.TraceId}") - .Content($"事件ID:{eventId.Id}") - .Content($"事件名称:{eventId.Name}"); - AddContent(state, config, log); - log.Exception(exception).Trace(); + var caption = string.Empty; + try + { + log + .Content($"工作单元跟踪号:{GetUnitOfWork()?.TraceId}") + .Content($"事件ID:{eventId.Id}") + .Content($"事件名称:{eventId.Name}"); + AddContent(state, config, log); + log.Exception(exception); + caption = formatter(state, exception); + success = true; + } + catch (Exception e) + { + InvokeHelper.OnInvokeException?.Invoke(e); + success = false; + } + finally + { + log.Caption($"执行EF操作:{caption}"); + if (success) + log.Trace(); + else + log.Error(); + } } /// diff --git a/framework/src/Bing.Ddd.Domain/Bing/Domain/ChangeTracking/ChangeTrackingContext.cs b/framework/src/Bing.Ddd.Domain/Bing/Domain/ChangeTracking/ChangeTrackingContext.cs index 86dfe2345..9f6865909 100644 --- a/framework/src/Bing.Ddd.Domain/Bing/Domain/ChangeTracking/ChangeTrackingContext.cs +++ b/framework/src/Bing.Ddd.Domain/Bing/Domain/ChangeTracking/ChangeTrackingContext.cs @@ -75,13 +75,14 @@ public void Add(IChangeTrackable leftObj, TObject rightObj) wh /// 属性类型 /// 值类型 /// 属性表达式。范例:t => t.Name + /// 领域对象 /// 新值。范例:newEntity.Name - public void Add(Expression> expression, TValue newValue) where TObject : IDomainObject + public void Add(Expression> expression, TObject obj, TValue newValue) where TObject : IDomainObject { var member = Lambdas.GetMemberExpression(expression); var name = Lambdas.GetMemberName(member); var desc = Reflection.Reflections.GetDisplayNameOrDescription(member.Member); - var value = Lambdas.GetValue(expression); + var value = member.Member.GetPropertyValue(obj); Add(name, desc, Conv.To(value), newValue); } diff --git a/framework/src/Bing.Ddd.Domain/Bing/Domain/Entities/DomainObjectBase.cs b/framework/src/Bing.Ddd.Domain/Bing/Domain/Entities/DomainObjectBase.cs index 3a967a48f..9f93e23f4 100644 --- a/framework/src/Bing.Ddd.Domain/Bing/Domain/Entities/DomainObjectBase.cs +++ b/framework/src/Bing.Ddd.Domain/Bing/Domain/Entities/DomainObjectBase.cs @@ -91,7 +91,7 @@ protected virtual void AddChanges(TObject newObj) { } /// 值类型 /// 属性表达式。范例:t => t.Name /// 新值。范例:newEntity.Name - protected void AddChange(Expression> expression, TValue newValue) => _changeTrackingContext.Add(expression, newValue); + protected void AddChange(Expression> expression, TValue newValue) => _changeTrackingContext.Add(expression, AssignableType(this), newValue); /// /// 添加变更 diff --git a/framework/tests/Bing.Tests/Applications/CrudServiceTest.Save.cs b/framework/tests/Bing.Tests/Applications/CrudServiceTest.Save.cs index b8b320c11..7d7a837a6 100644 --- a/framework/tests/Bing.Tests/Applications/CrudServiceTest.Save.cs +++ b/framework/tests/Bing.Tests/Applications/CrudServiceTest.Save.cs @@ -126,7 +126,7 @@ public async Task Test_SaveAsync_Add() [Fact] public async Task Test_SaveAsync_Update() { - _repository.FindAsync(_id).Returns(t => new EntitySample(_id)); + _repository.FindAsync(_id).Returns(t => new EntitySample(_id) { Name = "a" }); await _service.SaveAsync(new DtoSample { Id = _id.ToString(), Name = "b" }); await _repository.DidNotReceive().AddAsync(Arg.Any()); await _repository.Received().UpdateAsync(Arg.Is(t => t.Name == "b")); diff --git a/tests/Bing.Tests.Samples/Bing/Tests/Samples/RepositorySample.cs b/tests/Bing.Tests.Samples/Bing/Tests/Samples/RepositorySample.cs index c67d32dc7..85be67337 100644 --- a/tests/Bing.Tests.Samples/Bing/Tests/Samples/RepositorySample.cs +++ b/tests/Bing.Tests.Samples/Bing/Tests/Samples/RepositorySample.cs @@ -42,6 +42,15 @@ public EntitySample(Guid id) : base(id) { } /// [IgnoreMap] public string IgnoreValue { get; set; } + + /// + /// 添加变更列表 + /// + protected override void AddChanges(EntitySample other) + { + AddChange(x => x.Id, other.Id); + AddChange(x => x.Name, other.Name); + } } /// diff --git a/version.props b/version.props index 104778dd4..59fd75f83 100644 --- a/version.props +++ b/version.props @@ -2,7 +2,7 @@ 2 2 - 2 + 3 20220104-1 $(VersionMajor).$(VersionMinor).$(VersionPatch)