Clave compuesta Entity Framework 7 "La propiedad no se puede agregar al tipo de entidad

c# entity-framework entity-framework-core

Pregunta

Estoy tratando de hacer una entidad que gestione la membresía de un usuario en una organización con un rol. Quiero restringir a un usuario para que tenga solo una membresía en una organización. Estoy haciendo esto creando una clave compuesta. Sin embargo, recibo el error cuando intento crear las migraciones iniciales:

InvalidOperationException: la propiedad 'Usuario' no se puede agregar al tipo de entidad 'OrganizationLogin' porque ya existe una propiedad de navegación con el mismo nombre en el tipo de entidad 'OrganizationLogin'.

La entidad para la membresía

public class OrganizationLogin
{
    public int OrganizationLoginId { get; set; }
    public OrganizationRole Role { get; set; }
    public Organization Organization { get; set; }
    public OmegaUser User { get; set; } 

}

Mi DBContext donde intento definir la clave compuesta:

public class OmegaContext : IdentityDbContext<OmegaUser,OmegaRole,int>
{
    public DbSet<Log> Logs { get; set; }
    public DbSet<Organization> Organizations { get; set; }
    public DbSet<OrganizationLogin> OrganizationLogins { get; set; }
    public DbSet<OrganizationRole> OrganizationRoles { get; set; }

    public OmegaContext()
    {

    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<OrganizationLogin>(orgLogin =>
        {
            orgLogin.HasAlternateKey(o => new {o.User, o.Organization});
        });

    }
}

Si elimino el código OnModelCreating, las migraciones se crean con éxito.

EDITAR: Como se mencionó en los comentarios, el problema era que estaba haciendo referencia a la clase y no a una propiedad que tenía la clave de las entidades

Respuesta popular

Según lo solicitado, aquí está mi solución:

public class OrganizationUnitMember
{
    public int OrganizationUnitMemberId { get; set; }
    public int UserId { get; set; }
    public int OrganizationUnitId { get; set; }
    [ForeignKey("UserId")]
    public virtual OmegaUser User { get; set; }
    [ForeignKey("OrganizationUnitId")]
    public virtual OrganizationUnit OrganizationUnit { get; set; }
    public int RoleId { get; set; }
    [ForeignKey("RoleId")]
    public virtual OrganizationRole Role { get; set; }
}

Y el DbContext:

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<OrganizationUnit>(
            orgUnit =>
            {
                orgUnit.HasOne(ou => ou.Parent)
                    .WithMany(ou => ou.Children)
                    .OnDelete(DeleteBehavior.Restrict)
                    .HasForeignKey(ou => ou.ParentId);
            });
        builder.Entity<OrganizationUnitMember>(member =>
        {
            member.HasAlternateKey(m => new {m.OrganizationUnitId, m.UserId});
        });

    }

Tuve que añadir los ids de las entidades referenciadas.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué