2014-06-23 9 views
34

In EF 6.1 utilizzando codice In primo luogo è possibile creare indici utilizzando attributi nelle vostre Entità o utilizzando l'API fluente lungo le linee di:EF 6.1 Unico Nullable Indice

Property(x => x.PropertyName) 
       .IsOptional() 
       .HasMaxLength(450) 
       .HasColumnAnnotation("Index", 
        new IndexAnnotation(new IndexAttribute("IX_IndexName") {IsUnique = true, })); 

Esiste un modo per dire patibolo WHERE PropertyName IS NOT NULL nel allo stesso modo in SQL Server in modo nativo (vedi: https://stackoverflow.com/a/767702/52026)?

risposta

36

Non ho trovato un modo per dire a EF di usare questa clausola where, ma ecco qualche soluzione. Controlla se è adatto al tuo caso.

  1. Installare Entity Framework, di definire le DbContext, entità, string conn in app.config ecc
  2. consentire la migrazione - eseguito in Package Manager Console '-EnableMigration'
  3. Crea DbMigration - eseguito in Console Package Manager 'Add-Migration MigrationName'
  4. Nella classe DbMigration creata nel metodo ovverided Up, eseguire sql per la creazione di un indice nullable univoco.

codice:

// Add unique nullable index 
string indexName = "IX_UQ_UniqueColumn"; 
string tableName = "dbo.ExampleClasses"; 
string columnName = "UniqueColumn"; 

Sql(string.Format(@" 
    CREATE UNIQUE NONCLUSTERED INDEX {0} 
    ON {1}({2}) 
    WHERE {2} IS NOT NULL;", 
    indexName, tableName, columnName)); 

Nota: non dimenticare di creare un downgrade, anche. Ovveride Down metodo e utilizzare DropIndex metodo all'interno:

DropIndex(tableName, indexName); 

Inoltre potrebbe essere necessario un po 'di codice aggiuntivo se c'è già dati nel database, che possono entrare in conflitto con il vincolo indice univoco.

NOTA: qui è possibile utilizzare il metodo CreateIndex ma non sono riuscito a creare l'indice corretto con esso. EF ignora semplicemente i miei parametri anonimi o li scrivo in modo errato. Puoi provarlo tu stesso e scrivere qui con il tuo risultato. La sintassi è la seguente:

CreateIndex(
    table: "dbo.ExampleClasses", 
    columns: new string[] { "UniqueColumn" }, 
    unique: true, 
    name: "IX_UniqueColumn", 
    clustered: false, 
    anonymousArguments: new 
    { 
     Include = new string[] { "UniqueColumn" }, 
     Where = "UniqueColumn IS NOT NULL" 
    }); 

5 tenta di aggiungere due etries con valori nulli per la colonna unica ed altri valori uguali.

Ecco il mio codice demo - Pastebin

+1

Grazie Viktor! Funziona perfettamente per me. D'altra parte "anonymousArguments" dipende dal provider e SQL Server lo ignora. – Subgurim

+0

La soluzione Crea indice non funziona Preferisco che tu la rimuovessi perché mi ha confuso all'inizio. Grazie Viktor – kartal

+0

Davvero un peccato che l'approccio anonymousArguments non ha funzionato. Sembra che ci sia anche una mancanza di documentazione. Quali valori sono supportati ecc. – Dashu