es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tanto Table-Per-Hierarchy como Table-Per-Type en Entity Framework Core.

Por favor, tome en cuenta que la pregunta se trata de EF Core y no EF4 o EF6.

Tengo esta estructura:

public abstract class Account {}

public class Customer : Account {}

public abstract class Supplier : Account {}
public class Company : Supplier {}
public class Private : Supplier {}

Quiero generar algo como esto:

enter image description here

He configurado Entity Framework de la siguiente manera:

modelBuilder.Entity<account>(entity =>
{
    entity.ToTable("accounts");
    entity.HasNoDiscriminator();
}

modelBuilder.Entity<supplier>(entity =>
{
    entity.ToTable("suppliers", "fco");

    entity.HasDiscriminator<string>("supplier_type")
        .HasValue<company>("company")
        .HasValue<private>("private");
}

modelBuilder.Entity<customer>(entity =>
{
    entity.ToTable("customers", "cso");
}

Pero obtengo este error:

‘Customer’ está mapeado a la tabla ‘cso.customers’ mientras que ‘Account’ está mapeado a la tabla ‘accounts’. Mapea todos los tipos de entidades de la jerarquía a la misma tabla, o elimina el discriminador y mápalos a diferentes tablas. Consulta https://go.microsoft.com/fwlink/?linkid=2130430 para obtener más información.

Pero eso es lo que quiero.

Si modifico para manejar todo como ‘Tabla-Por-Tipo’, funciona. Pero no es lo que quiero.

¿Es posible obtener lo que necesito?

Gracias

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que no es posible mapear entidades en la jerarquía a diferentes tablas cuando se utiliza la herencia de tabla por jerarquía. Por lo tanto, para obtener la estructura deseada, deberás utilizar la herencia de tabla por tipo en su lugar.

    Sin embargo, si aún deseas utilizar la herencia de tabla por jerarquía, puedes evitar esta limitación mapeando todos los tipos de entidades en la jerarquía a la misma tabla y agregando un valor discriminador para cada tipo. Por ejemplo, podrías modificar tu código de la siguiente manera:

    modelBuilder.Entity<account>(entity =>
    {
        entity.ToTable("accounts");
        entity.HasDiscriminator<string>("account_type")
            .HasValue<customer>("customer")
            .HasValue<company>("company")
            .HasValue<private>("private");
    });
    
    modelBuilder.Entity<supplier>(entity =>
    {
        entity.HasDiscriminator<string>("supplier_type")
            .HasValue<company>("company")
            .HasValue<private>("private");
    });
    
    modelBuilder.Entity<customer>(entity =>
    {
        entity.HasBaseType<account>();
    });
    
    modelBuilder.Entity<company>(entity =>
    {
        entity.HasBaseType<supplier>();
        entity.ToTable("suppliers");
    });
    
    modelBuilder.Entity<private>(entity =>
    {
        entity.HasBaseType<supplier>();
        entity.ToTable("suppliers");
    });
    

    Este código configura Entity Framework para mapear todas las entidades a la tabla “accounts”, con un valor discriminador que indica el tipo de cada entidad. Los tipos de entidad “Company” y “Private” también se mapean a una tabla “suppliers”, pero sus valores discriminadores son los mismos que los de la clase base “Supplier”.

    Ten en cuenta que esta solución alternativa requiere agregar manualmente los valores discriminadores para cada tipo de entidad, y puede complicar las consultas y actualizaciones. Por lo tanto, utilizar la herencia de tabla por tipo puede ser un enfoque más simple y mantenible.

Comments are closed.