Comment créer un index pour une propriété de chaîne dans Entity Framework 7

entity-framework-core visual-studio-2015

Question

J'essaie de créer un premier modèle de code pour Entity Framework 7. J'utilise la version bêta de Visual Studio 2015 récemment publiée et les versions suivantes des packages EntityFramework (extrait de mon fichier project.json):

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

Il semble qu’à l’heure actuelle aucune annotation de données ne soit disponible et j’utilise la substitution OnModelCreating et les migrations récemment mises en œuvre (partiellement?) Pour créer mon modèle.

Pour l'instant, les clés primaires et les relations un à un fonctionnent, de même que la création d'index pour les types entiers. Par exemple:

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

Cet extrait de code génère le code de migration suivant:

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

Mais lorsque j'essaie d'ajouter un index à la propriété string, la migration est générée, mais lorsqu'elle est appliquée, elle est rejetée par SQL Server, apparemment en raison du type de colonne correspondant à nvarchar (MAX). Il semble que .Required().MaxLength(100) ne force pas la génération de type de colonne de chaîne limitée. Et bien qu’il existe une méthode pour changer le type de colonne, je n'arrive pas à trouver le moyen de l’appeler via 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);
        });

Migration résultante:

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

Est-il possible de créer un index sur une propriété de chaîne dans la version bêta de EF7?

Réponse acceptée

Malheureusement, pour le moment (7.0.0-beta1), les métadonnées de longueur maximale et de type de colonne ne sont pas prises en compte lors de la détermination du type de colonne à utiliser. Pour l'instant, vous devrez utiliser DDL brut lors de la migration.

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi