2014-06-23 34 views
34
Kod Öncelikle İşletmelerdeki Öznitelikler'i kullanarak dizinleri oluşturabilir kullanarak veya çizgisinde akıcı API kullanarak EF 6.1 olarak

:EF 6.1 Benzersiz null Endeksi

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

iskelesi WHERE PropertyName IS NOT NULL söylenecek herhangi bir yolu var mı SQL Server'da doğal olarak aynı şekilde (bkz: https://stackoverflow.com/a/767702/52026)?

cevap

36

EF'in bunu bu makalede kullanmasını söylemenin bir yolunu bulamadım, ancak burada bir kaç çözüm var. Davanıza uygun olup olmadığını kontrol edin.

  1. Varlık Framework, app.config vb daki DBContext, kişiler, bağl dize tanımlayın yükleyin
  2. Göç Enable - Paket Yöneticisi Konsolu çalıştırmak - Paket Yöneticisi Konsolu '-EnableMigration'
  3. DbMigration oluşturma çalışmasına 'Add-Migration MigrationName'
  4. Ovverided Up yönteminde oluşturulan DbMigration sınıfında, sql'nizi benzersiz nullable dizin oluşturmak için çalıştırın.

kodu:

// 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)); 

Not: de bir downgrade oluşturmak unutmayın. Zaten benzersiz dizin kısıtı çakışabilir veritabanınızda veri varsa

DropIndex(tableName, indexName); 

Ayrıca bazı ek kod gerekebilir: Down yöntemi ve iç DropIndex yöntemi kullanmak Ovveride.

Not: Burada CreateIndex yöntemini kullanabilirsiniz ancak doğru dizini oluşturmayı başaramadım. EF sadece anonim olanlarımı görmezden geliyor ya da yanlış yazarım. Kendiniz deneyebilir ve sonucunuzla burada yazabilirsiniz. sözdizimi aşağıdaki gibidir:

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 deneyin benzersiz sütun için boş değerler ve diğer eşit değerlere sahip iki etries ekleyin.

İşte demo kodum - Pastebin

+1

Teşekkürler Viktor! Benim için mükemmel çalışıyor. Öte yandan "anonymousArguments" sağlayıcıya bağımlıdır ve SQL Server bunu görmezden gelir. – Subgurim

+0

Oluşturma dizini çözümü çalışmıyor Başlatmayı tercih ediyorum çünkü başımın içinde kafam karıştı. Teşekkürler Viktor – kartal

+0

AnonymousArguments yaklaşımı işe yaramadı çok kötü. Çevresinde belge eksikliği var gibi görünüyor. Hangi değerler desteklenir vb. – Dashu