Cómo crear un índice para una propiedad de cadena en Entity Framework 7

entity-framework-core visual-studio-2015

Pregunta

Estoy tratando de crear un primer modelo de código para Entity Framework 7. Estoy usando Visual Studio 2015 Beta recientemente lanzado y las siguientes versiones de los paquetes EntityFramework (fragmento de mi archivo project.json):

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

Parece que actualmente no hay anotaciones de datos disponibles y estoy usando OnModelCreating override y migraciones recientemente implementadas (¿en parte?) Para crear mi modelo.

Por ahora, las claves primarias y las relaciones de una a una funcionan, así como la creación de índices para tipos enteros. Por ejemplo:

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

Este fragmento da como resultado el siguiente código de migración que se generará:

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

Pero cuando intento agregar un índice a la propiedad de cadena, se genera la migración, pero cuando se aplica es rechazado por SQL Server, aparentemente debido a que el tipo de columna es nvarchar (MAX). Parece que el .Required().MaxLength(100) no fuerza la generación del tipo de columna de cadena limitada. Y aunque hay un método para cambiar el tipo de columna, parece que no puedo encontrar la forma de llamarlo a través de 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);
        });

Migración resultante:

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

¿Hay una manera de crear un índice en la propiedad de cadena en la versión beta de EF7?

Respuesta aceptada

Lamentablemente, en este momento (7.0.0-beta1), no se respetan los metadatos de longitud máxima y tipo de columna al determinar qué tipo de columna usar. Por ahora, tendrá que desplegar DDL en bruto en la migración.

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


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué