2014-06-23 17 views
34

W EF 6.1 za pomocą kodu Najpierw można tworzyć indeksów przy użyciu atrybutów do podmiotów lub za pomocą biegle API wzdłuż linii:EF 6.1 Unikalna Nullable Index

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

Czy istnieje jakiś sposób, aby powiedzieć rusztowanie WHERE PropertyName IS NOT NULL w w taki sam sposób jak w SQL Server natywnie (patrz: https://stackoverflow.com/a/767702/52026)?

Odpowiedz

36

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.

  1. Install Entity Framework, Definiowanie DbContext podmioty, w stanie Connecticut ciąg w app.config itp
  2. Włącz migracja - uruchom w konsoli Menedżer pakietów '-EnableMigration'
  3. Tworzenie DbMigration - uruchomienie w konsoli Menedżer pakietu "Add-Migration MigrationName"
  4. 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

+1

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

+0

Tworzenie rozwiązania indeksu nie działa. Wolę go usunąć, ponieważ początkowo mnie pomylił. Dzięki Viktor – kartal

+0

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