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