Chiave composita Entity Framework 7 "La proprietà non può essere aggiunta al tipo di entità

c# entity-framework entity-framework-core

Domanda

Sto cercando di creare un'encity che gestisca l'appartenenza a un utente di un'organizzazione con un ruolo. Voglio limitare un utente ad avere un solo abbonamento in un'organizzazione. Lo sto facendo creando una chiave composita. Tuttavia ottengo l'errore quando provo a creare le migrazioni iniziali:

InvalidOperationException: la proprietà 'Utente' non può essere aggiunta al tipo di entità 'OrganizationLogin' perché esiste già una proprietà di navigazione con lo stesso nome sul tipo di entità 'OrganizationLogin'.

L'entità per l'appartenenza

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

}

Il mio DBContext dove cerco di definire la chiave composta:

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});
        });

    }
}

Se rimuovo il codice OnModelCreating, le migrazioni vengono create correttamente.

EDIT: Come accennato nei commenti, il problema era che stavo riferendo la classe e non una proprietà che aveva la chiave delle entità

Risposta popolare

Come richiesto, ecco la mia soluzione:

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; }
}

E il 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});
        });

    }

Ho dovuto aggiungere gli id ​​delle entità referenziate



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché