-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Closed
Closed
SensitiveDataLogging with ComplexProperty: Unable to cast RuntimeComplexType to type IEntityType#32198
Bug
Copy link
Milestone
Description
Hi, I found this while testing the new ComplexType
Whe i have turn on EnableSensitiveDataLogging and LogTo:
protected override void OnConfiguring(DbContextOptionsBuilder options)
.......
options.EnableSensitiveDataLogging();
options.LogTo(log =>
{
......
});
and then i use ComplexType on a List inside ComplexType :
builder.ComplexProperty(p => p.Information!, mBuilder =>
{
mBuilder.Property(mi => mi.Name);
mBuilder.ComplexProperty(mi => mi.Conditions); //List<class>
});
or if i convert this property to json string:
builder.ComplexProperty(p => p.Information!, mBuilder =>
{
mBuilder.Property(mi => mi.Name);
mBuilder.Property(mi => mi.Conditions).HasJsonConversion();
});
...
public static ComplexTypePropertyBuilder<T> HasJsonConversion<T>(this ComplexTypePropertyBuilder<T> propertyBuilder) where T : class, new()
{
ValueConverter<T, string> converter = new(
v => JsonConvert.SerializeObject(v) ?? string.Empty,
v => string.IsNullOrEmpty(v) ? new T() : JsonConvert.DeserializeObject<T>(v) ?? new T()
);
ValueComparer<T> comparer = new(
(l, r) => JsonConvert.SerializeObject(l) == JsonConvert.SerializeObject(r),
v => v == null ? 0 : JsonConvert.SerializeObject(v).GetHashCode(),
v => JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(v)) ?? new T()
);
propertyBuilder.HasConversion(converter);
propertyBuilder.Metadata.SetValueConverter(converter);
propertyBuilder.Metadata.SetValueComparer(comparer);
propertyBuilder.IsRequired(false);
return propertyBuilder;
}
The cast exception appear during commit add entity transaction.
stack trace
Unable to cast object of type 'Microsoft.EntityFrameworkCore.Metadata.RuntimeComplexType' to type 'Microsoft.EntityFrameworkCore.Metadata.IEntityType'.
at Microsoft.EntityFrameworkCore.Diagnostics.CoreLoggerExtensions.PropertyChangeDetectedSensitive(EventDefinitionBase definition, EventData payload)
at Microsoft.EntityFrameworkCore.Diagnostics.EventData.ToString()
at Microsoft.EntityFrameworkCore.Diagnostics.Internal.FormattingDbContextLogger.Log(EventData eventData)
at Microsoft.EntityFrameworkCore.Diagnostics.IDiagnosticsLogger.DispatchEventData(EventDefinitionBase definition, EventData eventData, Boolean diagnosticSourceEnabled, Boolean simpleLogEnabled)
at Microsoft.EntityFrameworkCore.Diagnostics.CoreLoggerExtensions.PropertyChangeDetectedSensitive(IDiagnosticsLogger`1 diagnostics, InternalEntityEntry internalEntityEntry, IProperty property, Object oldValue, Object newValue)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.LogChangeDetected(InternalEntityEntry entry, IProperty property, Object original, Object current)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectValueChange(InternalEntityEntry entry, IProperty property)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.LocalDetectChanges(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectChanges(IStateManager stateManager)
at Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.DetectChanges()
at Microsoft.EntityFrameworkCore.DbContext.TryDetectChanges()
at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__63.MoveNext()
at OwnComplex.Domain.Service.PeopleService.<AddThinPerson>d__4.MoveNext() in C:\Git2\dotNet\OwnComplex\OwnComplex.Domain\Service\PeopleService.cs:line 32
at OwnComplex.Domain.Service.ExampleService.<Example2HiddenId>d__3.MoveNext() in C:\Git2\dotNet\OwnComplex\OwnComplex.Domain\Service\ExampleService.cs:line 49
at OwnComplex.EF8.Worker.<Example2HiddenId>d__5.MoveNext() in C:\Git2\dotNet\OwnComplex\OwnComplex.EF8\Worker.cs:line 47
at OwnComplex.EF8.Worker.<ExecuteAsync>d__3.MoveNext() in C:\Git2\dotNet\OwnComplex\OwnComplex.EF8\Worker.cs:line 22
at Microsoft.Extensions.Hosting.Internal.Host.<<StartAsync>b__15_1>d.MoveNext()
at Microsoft.Extensions.Hosting.Internal.Host.<ForeachService>d__18`1.MoveNext()
at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>g__LogAndRethrow|15_3(<>c__DisplayClass15_0& )
at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>d__15.MoveNext()
at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.<RunAsync>d__4.MoveNext()
at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.<RunAsync>d__4.MoveNext()
at Program.<<Main>$>d__0.MoveNext() in C:\Git2\dotNet\OwnComplex\OwnComplex.EF8\Program.cs:line 37
at Program.<Main>(String[] args)
EF Core version: 8.0.0-rc.2.23480.1
Database provider: Microsoft.EntityFrameworkCore.SqlServer
Target framework: net8.0
IDE: Visual Studio Professional 2022 (64-bit) - Preview Version 17.8.0 Preview 3.0