Inicio de EF extremadamente lento: 15 minutos

Hace algún tiempo creé un sistema, en el que el usuario puede definir categorías con archivos personalizados para algunos objetos. Luego, cada objeto tiene FieldValue según su categoría. Clases a continuación:

public class DbCategory
    {
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public TextDbField MainField { get; set; }
        public List<DbField> Fields { get; set; }
    }

 public class DbObject
    {
        public int Id { get; set; }
        public byte[] Bytes { get; set; }

        [Required]
        public DbCategory Category { get; set; }

        public TextDbFieldValue MainFieldValue { get; set; }
        public List<DbFieldValue> FieldsValues { get; set; }
    }

public abstract class DbField
    {
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public bool Required { get; set; }


    }


    public class IntegerDbField : DbField
    {
        public int? Minimum { get; set; }
        public int? Maximum { get; set; }
    }

    public class FloatDbField : DbField
    {
        public double? Minimum { get; set; }
        public double? Maximum { get; set; }

    }
//... few other types

  public abstract class DbFieldValue
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public DbField Field { get; set; }

        [JsonIgnore]
        public abstract string Value { get; set; }
    }


    public class IntDbFieldValue : DbFieldValue
    {
        public int? IntValue { get; set; }

        public override string Value
        {
            get { return IntValue?.ToString(); }
            set
            {
                if (value == null) IntValue = null;
                else IntValue = int.Parse(value);
            }
        }
    }// and other FieldValue types

En mi máquina de desarrollo (i5, 16bg ram y unidad ssd), base de datos (en SqlExpress) con 4 categorías, cada una con 5-6 campos, 10k registros, la primera consulta toma alrededor de 15s. Esta primera consulta es

var result = db.Objects
     .Include(s => s.Category)
     .Include(s => s.Category.MainField)
     .Include(s => s.MainFieldValue.Field)
     .Include(s => s.FieldsValues.Select(f => f.Field))
     .Where(predicate ?? AlwaysTrue)
     .ToArray();

Hago eso para cargar todo en la memoria. Luego, trabajo en la lista en caché y solo escribo los cambios en la base de datos. Hago eso, porque el usuario puede realizar búsquedas con filtro en cada FieldValue. La consulta de la base de datos cada vez demostró ser muy lenta, pero esta parte funciona bastante bien.

El problema ocurre más tarde. Algunos clientes definieron 6 categorías con más de 20 campos en cada una, y almacenan más de 70k registros, el inicio a veces lleva más de 15 minutos. Después de eso, no hay diferencia en la velocidad entre 5k y 50k.

Todas las técnicas para mejorar el Código de EF El primer tiempo de inicio que he encontrado considera principalmente el almacenamiento en caché de creación de vistas, el EF de ngening, etc., pero en este caso el tiempo de inicio aumenta después de agregar más registros, no más tipos de entidades.

Me doy cuenta de que eso es causado por la complejidad del esquema, pero ¿hay alguna forma de acelerar esto? Afortunadamente, este es el servicio de Windows, por lo que una vez que se inicia, dura semanas, pero aún así.

¿Debería soltar EF para la primera carga y hacerlo en SQL puro? ¿Debo hacer esto en lotes? ¿Debo cambiar EF a nHibernate? ¿O algo mas? En servidores virtualizados durante la ejecución de esta línea, este programa maximiza la CPU (no el servidor SQL, sino mi aplicación).

He intentado cargar objetos solo y luego cargar sus propiedades más tarde. Esto fue un poco más rápido (pero no notablemente) en bases de datos pequeñas, pero es aún más lento en las más grandes. Cualquier ayuda apreciada, incluso si la respuesta es "aguanta y espera".

Respuestas a la pregunta(1)

Su respuesta a la pregunta