Non ho trovato un modo per dire a EF di usare questa clausola where, ma ecco qualche soluzione. Controlla se è adatto al tuo caso.
- Installare Entity Framework, di definire le DbContext, entità, string conn in app.config ecc
- consentire la migrazione - eseguito in Package Manager Console '-EnableMigration'
- Crea DbMigration - eseguito in Console Package Manager 'Add-Migration MigrationName'
- 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
fonte
2014-06-23 12:18:49
Grazie Viktor! Funziona perfettamente per me. D'altra parte "anonymousArguments" dipende dal provider e SQL Server lo ignora. – Subgurim
La soluzione Crea indice non funziona Preferisco che tu la rimuovessi perché mi ha confuso all'inizio. Grazie Viktor – kartal
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