none
Error con índice (Fluent Api + EF6) RRS feed

  • Pregunta

  • Buenas,

    Tengo la siguiente entidad de dominio:

    public class ENRecurso : ENBase
    {
    	public int ModuloId { get; set; }		// PK, FK
    	public int RecursoId { get; set; }		// PK
    	public string Nombre { get; set; }
    	public string Descripcion { get; set; }
    	public string Clave { get; set; }
    	public int Orden { get; set; }
    	public int CodEstado { get; set; }		// FK
    
    	public virtual ENModulo Modulo { get; set; }
    	public virtual ENEstadoDet Estado { get; set; }
    
    	public virtual ICollection<ENOperacion> RecursosOperacion { get; set; }
    }

    La configuración a través de Fluent Api tiene la siguiente forma:

    public class RecursoConfiguration : EntityTypeConfiguration<ENRecurso>
    {
    	public RecursoConfiguration(DbModelBuilder modelBuilder, string schemaName)
    	{
    		HasKey(t => new { t.ModuloId, t.RecursoId });
    
    		Property(t => t.Nombre).HasMaxLength(200).IsRequired();
    
    		Property(t => t.Descripcion).HasMaxLength(250).IsOptional();
    
    		Property(t => t.Clave).HasMaxLength(50).IsRequired();
    		
    		HasIndex(t => new { t.Nombre, t.ModuloId, t.CodEstado })
    			.HasName("IX_RECURSO_NOMBRE_MODULO_ESTADO")
    			.IsUnique()
    			.IsClustered(false);
    
    		HasIndex(t => new { t.ModuloId, t.Clave, t.CodEstado })
    			.HasName("IX_RECURSO_MODULO_CLAVE_ESTADO")
    			.IsUnique()
    			.IsClustered(false);
    
    		HasIndex(t => new { t.ModuloId, t.Orden, t.CodEstado })
    			.HasName("IX_RECURSO_MODULO_ORDEN_ESTADO")
    			.IsUnique()
    			.IsClustered(false);
    
    		modelBuilder.Entity<ENModulo>()
    			.HasMany(t => t.ModulosRecurso)
    			.WithRequired(t => t.Modulo)
    			.HasForeignKey(t => t.ModuloId);
    
    		modelBuilder.Entity<ENEstadoDet>()
    			.HasMany(t => t.EstadosRecurso)
    			.WithRequired(t => t.Estado)
    			.HasForeignKey(t => t.CodEstado);
    
    		Ignore(t => t.Encrypt);
    
    		ToTable("Recurso", schemaName);
    	}
    }

    En la Base de Datos se han creado los índices de la siguiente manera:

    No comprendo porqué sólo el índice IX_RECURSO_MODULO_ORDEN_ESTADO contiene todas las columnas que le he especificado a través de Fluent Api y los otro sólo cosieran un campo. Esto me está causando problemas, ya que pretendo que un nombre pueda repetirse para un ModuloId/CodEstado distinto y así como está me arroja el siguiente error para este caso:

    No se puede insertar una fila de clave duplicada en el objeto 'Seguridad.Recurso' con índice único 'IX_RECURSO_NOMBRE_MODULO_ESTADO'. El valor de la clave duplicada es (UserAdmin). Se terminó la instrucción.

    Lo mismo ocurre con el otro índice donde pretendo que también una clave pueda repetirse para un ModuloId/CosEstado distinto:

    No se puede insertar una fila de clave duplicada en el objeto 'Seguridad.Recurso' con índice único 'IX_RECURSO_MODULO_CLAVE_ESTADO'. El valor de la clave duplicada es (UserAdminKey). Se terminó la instrucción.

    Qué estoy haciendo mal, cómo puedo hacer para que el índice realmente considere los campos que le estoy especificando.

    Muchas gracias, saludos.


    • Editado eduar2083 miércoles, 12 de junio de 2019 15:46
    miércoles, 12 de junio de 2019 15:43

Todas las respuestas