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à
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