Entity Framework 7 tiene problemas para crear la migración porque existe una propiedad de navegación con el mismo nombre

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

Pregunta

Estoy intentando crear mi primera migración usando Entity Framework 7 con el desarrollo del código primero y recibo el siguiente error:

La propiedad 'Correo electrónico' no se puede agregar al tipo de entidad 'UserDTO' porque ya existe una propiedad de navegación con el mismo nombre en el tipo de entidad 'UserDTO'.

Mi entorno es: 1) Visual Studio 2015 2) Entity Framework v7.0.0-rc1-final 3) Desarrollo del primer código 4) Uso de la API fluida, no anotaciones de datos

No puedo averiguar cuál es la causa raíz del problema, pero tengo algunas ideas. Se supone que mi clase RoleDTO utiliza su propiedad de dirección de correo electrónico como su PK, y también tiene una colección de objetos RoleDTO como propiedad.

A continuación se muestra la única clase que he heredado de DbContext en este momento. He comentado la otra entidad que tengo que tratar de reducir el 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);
    }
}

Y aquí está la clase UserDTO. ¿Alguien puede ver qué está causando el error cuando intento realizar la migración?

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

Si cambio la clave de UserDTO a una cadena simple en lugar del objeto completo Dirección del correo electrónico, parece que supera ese error y obtengo una diferente, igualmente interesante:

La propiedad 'Roles' en el tipo de entidad 'Microsoft.SRE.NavisionOnline.ConfigurationAutomation.DAL.SQLEntities.UserDTO' no se ha agregado al modelo o se ha ignorado.

Respuesta aceptada

Por lo que sé, no se puede usar el tipo complejo como PK.

Para el segundo mensaje de error: No puede usar ICollection<string> Roles {..} , EF no asignará esta propiedad a una tabla porque está usando "cadena" como tipo.

Es necesario definir la clase de rol y asignarle un PK

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

Y luego en tu UserDTO:

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



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é