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

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions