Come creare un indice per una proprietà stringa in Entity Framework 7

entity-framework-core visual-studio-2015

Domanda

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):

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

Sembra che attualmente non siano disponibili annotazioni di dati e sto utilizzando le migrazioni OnModelCreating e le migrazioni (in parte?) Recentemente implementate per creare il mio modello.

Per ora, le chiavi primarie e le relazioni uno-a-uno funzionano così come la creazione di 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);
});

Questo snippet genera il seguente codice di migrazione 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 un indice alla proprietà stringa, la migrazione viene generata, ma quando viene applicata viene respinta da SQL Server, apparentemente a causa del tipo di colonna nvarchar (MAX). Sembra che .Required().MaxLength(100) non impone la generazione limitata del tipo di colonna di stringhe. E sebbene ci sia un metodo per cambiare il tipo di colonna, non riesco a trovare il modo di chiamarlo tramite 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?

Risposta accettata

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

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché