Entity Framework 7 non riesce a creare la migrazione perché esiste una proprietà di navigazione con lo stesso nome

c# ef-code-first ef-fluent-api entity-framework-core

Domanda

Sto provando a creare la mia prima migrazione utilizzando Entity Framework 7 con lo sviluppo del codice prima e sto ricevendo il seguente errore:

La proprietà 'Email' non può essere aggiunta al tipo di entità 'UserDTO' perché esiste già una proprietà di navigazione con lo stesso nome sul tipo di entità 'UserDTO'.

Il mio ambiente è: 1) Visual Studio 2015 2) Entity Framework v7.0.0-rc1-final 3) Primo sviluppo del codice 4) Utilizzo dell'API fluente, non delle annotazioni di dati

Non riesco a capire quale sia la causa principale del problema, ma ho qualche idea. La mia classe RoleDTO dovrebbe utilizzare la sua proprietà dell'indirizzo email come PK e ha anche una collezione di oggetti RoleDTO come proprietà.

Di seguito è l'unica classe che ho ereditato da DbContext adesso. Ho commentato l'altra entità che devo cercare di ridurre il problema.

class StorageContext : DbContext
{
    public DbSet<UserDTO> Users { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("MySQLServerConnectionString")
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserDTO>().HasKey(entity => entity.Email);
        //modelBuilder.Entity<UserDTO>().HasMany(entity => entity.Roles);
    }
}

Ed ecco la classe UserDTO. Qualcuno può vedere che cosa sta causando l'errore quando sto provando a fare la migrazione?

class StorageContext : DbContext
{
    public DbSet<UserDTO> Users { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("MySQLServerConnectionString")
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserDTO>().HasKey(entity => entity.Email);
        //modelBuilder.Entity<UserDTO>().HasMany(entity => entity.Roles);
    }
}

Se cambio la chiave per UserDTO in una stringa semplice invece che nell'oggetto complesso EmailAddress sembra che superi quell'errore e ne ottenga uno diverso, ugualmente interessante:

La proprietà 'Ruoli' sul tipo di entità 'Microsoft.SRE.NavisionOnline.ConfigurationAutomation.DAL.SQLEntities.UserDTO' non è stata aggiunta al modello o ignorata.

Risposta accettata

Per quanto ne so non puoi usare il tipo complesso come PK.

Per il secondo messaggio di errore: Non è possibile utilizzare ICollection<string> Roles {..} , EF non assocerà questa proprietà a una tabella perché si sta utilizzando "string" come tipo.

È necessario definire la classe di ruolo e assegnarla a un PK

public class Role
{
     public int Id {get; set;}
     public string RoleName {get; set;}
}

E poi nel tuo UserDTO:

public class Role
{
     public int Id {get; set;}
     public string RoleName {get; set;}
}



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é