Relación unidireccional de muchos a muchos + Entity Framework Core + fluent api

Quería crear una relación unidireccional entre Author y Skill.

Mis modelos son los siguientes:

public class Author: Entity
{
    ...
    public virtual ICollection Skills { get; set; }
    ...
}

public class Skill : Entity
{
    ...
}

Quiero configurarlo usando la idea básica de API fluida de EF Core no es crear modelos basados en el requisito de la capa de persistencia.

Mi configuración es la siguiente:

builder.HasMany(r => r.Skills).WithMany("NavigationNotRequired");

Pregunta hecha hace 3 años, 4 meses, 26 días - Por geekguru


3 Respuestas:

  • El apoyo a las relaciones unidireccionales de muchas a muchas personas ya está disponible en el núcleo del Marco de Entidades 7.

    En su caso, parecería:

    builder.HasMany(r => r.Skills).WithMany();
    

    Respondida el Dec 20, 2020 a las 17:02 - por quantumcoder

    Votos positivos: 0 | Votos negativos: 0

  • El código que has proporcionado para configurar la relación muchos a muchos entre las entidades Author y Skill no es correcto. Para configurar una relación muchos a muchos de manera unidireccional entre dos entidades en Entity Framework Core usando Fluent API, puedes seguir los siguientes pasos:

    • Asegúrate de tener las entidades `Author` y `Skill` definidas correctamente, como mencionaste en tu pregunta.
    • Define el método `OnModelCreating` en tu clase que hereda de `DbContext` para configurar la relación muchos a muchos usando Fluent API. Aquí te muestro un ejemplo de cómo hacerlo:
    csharp
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .HasMany(a => a.Skills)
            .WithMany()
            .UsingEntity(j => j.ToTable("AuthorSkills"));
    
        modelBuilder.Entity()
            .HasOne(asr => asr.Author)
            .WithMany()
            .HasForeignKey(asr => asr.AuthorId);
    
        modelBuilder.Entity()
            .HasOne(asr => asr.Skill)
            .WithMany()
            .HasForeignKey(asr => asr.SkillId);
    }
    
    • Define la clase `AuthorSkill` que servirá como una clase de unión para la relación muchos a muchos. En esta clase, se deben incluir las propiedades `AuthorId` y `SkillId` para establecer las relaciones entre `Author` y `Skill`.
    csharp
    public class AuthorSkill
    {
        public int AuthorId { get; set; }
        public Author Author { get; set; }
    
        public int SkillId { get; set; }
        public Skill Skill { get; set; }
    }
    
    • Asegúrate de agregar la tabla de unión `AuthorSkills` en la base de datos para mantener la relación entre `Author` y `Skill`.

    Con estos pasos, deberías poder configurar una relación muchos a muchos unidireccional entre las entidades Author y Skill utilizando Entity Framework Core y Fluent API. ¡Espero que esta información te haya sido útil! Si tienes alguna otra pregunta, no dudes en decírmelo.

    Respondida el Dec 21, 2020 a las 17:01 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Tu configuración de Fluent API es incorrecta para establecer una relación unidireccional de muchos a muchos entre Author y Skill. Aquí tienes la configuración correcta:

    
    builder.HasMany(r => r.Skills).WithMany("Authors");
    

    Esta configuración creará una tabla de unión llamada AuthorSkills con dos columnas de clave externa: AuthorId y SkillId. La propiedad de navegación Skills en Author permitirá el acceso a las habilidades asociadas, pero la propiedad de navegación Authors en Skill no estará disponible porque la relación es unidireccional.

    Aquí tienes un ejemplo de cómo utilizar esta configuración:

    
    using Microsoft.EntityFrameworkCore;
    
    public class MyContext : DbContext
    {
        public DbSet Authors { get; set; }
        public DbSet Skills { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity()
                .HasMany(r => r.Skills)
                .WithMany("Authors");
        }
    }
    

    Ahora puedes utilizar la propiedad de navegación Skills en Author para acceder a las habilidades asociadas, pero no podrás utilizar la propiedad de navegación Authors en Skill para acceder a los autores asociados.

    Respondida el Dec 21, 2020 a las 17:14 - por Gemini

    Votos positivos: 0 | Votos negativos: 0