如何在Entity Framework 7中為字符串屬性創建索引

entity-framework-core visual-studio-2015

我正在嘗試為Entity Framework 7創建代碼優先模型。我正在使用最近發布的Visual Studio 2015 Beta和以下版本的EntityFramework包(來自我的project.json文件的片段):

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

看起來目前沒有數據註釋可用,我正在使用OnModelCreating覆蓋和最近實現(部分?)遷移來創建我的模型。

目前,主鍵和一對一關係起作用以及為整數類型創建索引。例如:

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

此代碼段會生成以下遷移代碼:

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

但是當我嘗試將索引添加到字符串屬性時,會生成遷移,但是當應用被SQL Server拒絕時,顯然是由於列類型為nvarchar(MAX)。看起來像.Required().MaxLength(100)不會強制生成有限的字符串列類型。雖然有一種方法可以改變列類型,但我似乎找不到通過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);
        });

導致的遷移:

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

有沒有辦法在EF7的beta版本中創建字符串屬性的索引?

一般承認的答案

不幸的是,此時(7.0.0-beta1),在確定要使用的列類型時,不會遵守最大長度和列類型元數據。目前,您必須在遷移過程中下拉到原始DDL。

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow