Skip to content

SensitiveDataLogging with ComplexProperty: Unable to cast RuntimeComplexType to type IEntityType #32198

@sakrut

Description

@sakrut

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions