Unknown column in field list error using Complex types in EF Core 3

1.1k Views Asked by At

For context, I'm in the process of migrating our EF6 Db Context to EF Core 3. Why EF Core 3 only? Currently we're not able to upgrade to the latest EF Core version because of project constraints. We're still using .NET Framework 4.5.6, we're slowly upgrading.

Libaries used

  • EF Core 3.1.19
  • Devart.Data.MySql.Entity.EFCore 8.19

The models

public class AutomatedInvestigation
{      
    public int AutomatedSearchScreenshotId { get; set; }
    
    public int OrderId { get; set; }
    
    public int OrderLineItemId { get; set; }
    
    public int ServiceId { get; set; }
    
    public int? ComponentId { get; set; }

    public OrderLineItemResults Result { get; set; }

    public int? PageSourceDocumentId { get; set; }

    public string Errors { get; set; } = string.Empty;
    
    public DateTime CreateDateTime { get; set; }
    
    public DateTime EditDateTime { get; set; }               
    
    public SearchRequestParameters SearchParameters { get; set; }
    
    public Service Service { get; set; }
    
    public Subject Subject { get; set; }
    
    public Order Order { get; set; }
    
    public OrderLineItem OrderLineItem { get; set; }

    public virtual Component Component { get; set; }
}

[ComplexType]
public class SearchRequestParameters
{
    public SearchRequestParameters()
    {
        this.Serialized = string.Empty;
    }

    [NotMapped]
    [JsonIgnore]
    public string Serialized
    {

        get { return JsonConvert.SerializeObject(Parameters); }
        set
        {
            if (string.IsNullOrEmpty(value)) return;

            var parameters = JsonConvert.DeserializeObject<SearchParameters>(value);

            Parameters = parameters ?? new SearchParameters();
        }

    }

    public SearchParameters Parameters { get; set; }
}


[ComplexType]
public class SearchParameters
{
    public string FirstName { get; set; } = string.Empty;
    public string LastName { get; set; } = string.Empty;
    public DateTime DOB { get; set; }
    public string State { get; set; } = string.Empty;
}

The model builder (excluded irrelevant code)

internal static ModelBuilder BuildAutomationInvestigationModel(this ModelBuilder modelBuilder)
    {
        var entityTypeBuilder = modelBuilder.Entity<AutomatedInvestigation>();


        entityTypeBuilder.OwnsOne(s => s.SearchParameters, sa =>
        {
            sa.OwnsOne(p => p.Parameters, pa =>
            {
                pa.Property(p => p.FirstName);
                pa.Property(p => p.LastName);
                pa.Property(p => p.DOB);
                pa.Property(p => p.State);
            });
        });

        entityTypeBuilder.ToTable("automated_investigations")
            .HasKey(p => p.AutomatedSearchScreenshotId);

        entityTypeBuilder.MapProperties()
                         .MapRelations();

        return modelBuilder;
    }

    private static EntityTypeBuilder<AutomatedInvestigation> MapProperties(this EntityTypeBuilder<AutomatedInvestigation> entityTypeBuilder)
    {
        entityTypeBuilder.Property(p => p.AutomatedSearchScreenshotId).HasColumnName("automated_investigation_id");
        entityTypeBuilder.Property(p => p.OrderId).HasColumnName("order_id").IsRequired();
        entityTypeBuilder.Property(p => p.OrderLineItemId).HasColumnName("order_line_item_id").IsRequired();
        entityTypeBuilder.Property(p => p.ServiceId).HasColumnName("service_id").IsRequired();
        entityTypeBuilder.Property(p => p.ComponentId).HasColumnName("component_id").IsRequired(false);
        entityTypeBuilder.Property(p => p.Result).IsRequired();
        entityTypeBuilder.Property(p => p.PageSourceDocumentId).IsRequired(false);
        entityTypeBuilder.Property(e => e.Errors)
               .IsRequired()
               .HasColumnName("errors")
               .HasColumnType("mediumtext");

        entityTypeBuilder.Property(p => p.CreateDateTime).HasColumnName("create_datetime").IsRequired();
        entityTypeBuilder.Property(p => p.EditDateTime).HasColumnName("edit_datetime").IsRequired();

        return entityTypeBuilder;
    }

The error

enter image description here

I've tried adding HasColumnName but throws the same error. I've also tried using [Owned] annotation instead of the OwnsOne on the model builder but throws the same error. Also tried just specifying "SearchParameters" but will throw unknown column on "Parameters".

0

There are 0 best solutions below