2014-11-15 9 views
5

Sto provando a creare un primo modello di codice per Entity Framework 7. Uso la versione beta di Visual Studio 2015 rilasciata di recente e le seguenti versioni di pacchetti EntityFramework (snippet dal mio file project.json):Come creare un indice per una proprietà stringa in Entity Framework 7

"EntityFramework.SqlServer": "7.0.0-beta1", 
"EntityFramework.Commands": "7.0.0-beta1", 

sembra che in questo momento non sono disponibili le annotazioni di dati e sto usando l'override OnModelCreating e recentemente implementato (in parte) le migrazioni di creare il mio modello?.

Per ora, le chiavi primarie e le relazioni uno-a-uno funzionano come pure gli indici per i tipi interi. Per esempio:

builder.Entity<Article>(e => 
{ 
    e.Key(c => c.Id); 
    e.OneToOne<Category>(c => c.Category); 
    e.Index(c => c.Time).IsUnique(false); 
}); 

risultati Questo frammento di codice seguente migrazioni da generare:

migrationBuilder.CreateTable("Article", 
      c => new 
       { 
        Id = c.String(), 
// ... 
        CategoryIdKey = c.Int(nullable: false), 
        Time = c.DateTime(nullable: false), 
// ... 
       }) 
      .PrimaryKey("PK_Article", t => t.Id) 
      .UniqueConstraint("UC_Article_CategoryIdKey", t => t.CategoryIdKey); 

     migrationBuilder.AddForeignKey("Category", "FK_Category_Article_CategoryId", new[] { "CategoryId" }, "Article", new[] { "CategoryIdKey" }, cascadeDelete: false); 

     migrationBuilder.CreateIndex("Article", "IX_Article_Time", new[] { "Time" }, isUnique: false, isClustered: false); 

Ma quando sto cercando di aggiungere indice proprietà di stringa, viene generato la migrazione, ma quando applicate viene rifiutato da SQL Server, apparentemente a causa del tipo di colonna nvarchar (MAX). Sembra che lo .Required().MaxLength(100) non imponga la generazione limitata del tipo di colonna di stringhe. E se c'è un metodo per cambiare il tipo di colonna, io non riesco a trovare il modo per chiamare attraverso ModelBuilder:

 builder.Entity<Keyword>(e => 
     { 
      e.Key(c => c.Id); 
      e.Property(c => c.Word).Required().MaxLength(100); 
      e.Index(c => c.Word).IsUnique(true); 
     }); 

migrazione risultante:

 migrationBuilder.CreateTable("Keyword", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Word = c.String(nullable: false, maxLength: 100) 
       }) 
      .PrimaryKey("PK_Keyword", t => t.Id); 

     migrationBuilder.CreateIndex("Keyword", "IX_Keyword_Word", new[] { "Word" }, isUnique: true, isClustered: false); 

C'è un modo per creare un indice sulla proprietà stringa nella versione beta di EF7?

+1

BTW, Ho anche archiviato [# 1071] (https://github.com/aspnet/EntityFramework/issues/1071). – bricelam

risposta

5

Sfortunatamente in questo momento (7.0.0-beta1), i metadati di tipo lunghezza e colonna massima non vengono rispettati quando si determina il tipo di colonna da utilizzare. Per ora, devi passare al DDL non elaborato nella migrazione.

// Add before CreateIndex 
migrationBuilder.Sql("ALTER TABLE [Keyword] ALTER COLUMN [Word] nvarchar(4000)"); 
+0

Grazie per le informazioni. Attualmente, sono andato modificando manualmente il file generato migrazioni, aggiungendo il parametro 'dataType': ' migrationBuilder.CreateTable ("Parola chiave", c => nuova { Id = c.Int (nullable: false identità: true), Word = c.String (nullable: false, maxLength: 100, dataType: "nvarchar (100)") }) .PrimaryKey ("PK_Keyword", t => t.Id); ' sembra come la tua variante dovrebbe essere fatta anche nel file di migrazioni generato, invece del sovraccarico di OnModelCreating? –

+0

Corretto, nel codice di migrazione. (Ho chiarito la mia risposta.) – bricelam

Problemi correlati