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.

EF Core: Relación muchos a muchos sin colecciones de entidades de navegación.

Quiero implementar un modelo que cumpla con los principios de DDD y agregados.

Tengo una relación muchos a muchos entre una compañía y un usuario, pero ambos son raíces de agregados y quiero modelar su relación mediante la referencia de Ids y no de los tipos de entidades, es decir:

¿Es posible utilizar la API Fluent model builder para permitir esto? Es decir, ¿para que construya una tabla muchos a muchos que consista en las columnas: | UserId | CompanyId |?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible utilizar la API del modelo constructor Fluent para permitir una relación de muchos a muchos entre una Company y un User y, al mismo tiempo, seguir los principios de DDD y agregados. Puede utilizar los métodos HasMany y WithMany para definir la relación en el método OnModelCreating de su clase DbContext.

    Primero, deberá crear una nueva entidad para representar la relación de muchos a muchos:

    public class CompanyUser
    {
        public int CompanyId { get; set; }
        public Company Company { get; set; }
        public int UserId { get; set; }
        public User User { get; set; }
    }
    

    Luego, puede utilizar la API Fluent para configurar las relaciones entre las entidades en su método OnModelCreating:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<companyuser>()
            .HasKey(cu => new { cu.CompanyId, cu.UserId });
    
        modelBuilder.Entity<companyuser>()
            .HasOne(cu => cu.Company)
            .WithMany(c => c.CompanyUsers)
            .HasForeignKey(cu => cu.CompanyId);
    
        modelBuilder.Entity<companyuser>()
            .HasOne(cu => cu.User)
            .WithMany(u => u.CompanyUsers)
            .HasForeignKey(cu => cu.UserId);
    }
    

    Esto creará una nueva tabla en su base de datos con las columnas CompanyId y UserId, que representarán la relación de muchos a muchos entre empresas y usuarios. Sus entidades Company y User pueden entonces hacer referencia a estas entidades CompanyUser utilizando sus Ids:

    public class Company
    {
        public List<int> CompanyUserIds { get; set; }
        public List<companyuser> CompanyUsers { get; set; }
    }
    
    public class User
    {
        public List<int> CompanyUserIds { get; set; }
        public List<companyuser> CompanyUsers { get; set; }
    }
    

    Tenga en cuenta que es posible que deba modificar los nombres de las propiedades de navegación y las propiedades de clave foránea en función de su modelo de dominio específico.

Comments are closed.