Nie znalazłem sposobu, aby powiedzieć EF, aby użyć tego, gdzie klauzula, ale tutaj jest pewne obejście tego problemu. Sprawdź, czy pasuje do twojego przypadku.
- Install Entity Framework, Definiowanie DbContext podmioty, w stanie Connecticut ciąg w app.config itp
- Włącz migracja - uruchom w konsoli Menedżer pakietów '-EnableMigration'
- Tworzenie DbMigration - uruchomienie w konsoli Menedżer pakietu "Add-Migration MigrationName"
- W utworzonej klasie DbMigration w ovverided
Up
uruchom sql, aby utworzyć niepowtarzalny indeks zerowalny.
Kod:
// 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));
Uwaga: nie zapomnij utworzyć downgrade, too. Ovveride Down
metoda i sposób korzystania DropIndex
Wewnątrz:
DropIndex(tableName, indexName);
także możesz potrzebować dodatkowego kodu, jeśli nie ma już danych w bazie danych, które mogą być sprzeczne z unikalność indeksu.
UWAGA: W tym miejscu można użyć metody CreateIndex, ale nie udało mi się utworzyć odpowiedniego indeksu. EF po prostu ignoruje moje anonimowe argumenty lub źle je piszę. Możesz spróbować samemu i napisać tutaj ze swoim wynikiem. Składnia jest następująca:
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 spróbuj dodać dwa etries z wartościami NULL dla unikalnej kolumny i innych równych wartości.
Oto mój kod demonstracyjny - Pastebin
Dzięki Viktor! Działa to idealnie dla mnie. Z drugiej strony "anonymousArguments" zależy od dostawcy, a SQL Server po prostu go ignoruje. – Subgurim
Tworzenie rozwiązania indeksu nie działa. Wolę go usunąć, ponieważ początkowo mnie pomylił. Dzięki Viktor – kartal
Naprawdę szkoda, że podejście AnonymousArguments nie zadziałało. Wydaje się również, że brakuje w nim dokumentacji. Jakie wartości są obsługiwane itd. – Dashu