如何在 Entity Framework 7 中为字符串属性创建索引

Posted

技术标签:

【中文标题】如何在 Entity Framework 7 中为字符串属性创建索引【英文标题】:How to create an index for a string property in Entity Framework 7 【发布时间】:2015-01-13 01:29:55 【问题描述】:

我正在尝试为 Entity Framework 7 创建代码优先模型。我正在使用最近发布的 Visual Studio 2015 Beta 和以下版本的 EntityFramework 包(来自我的 project.json 文件的 sn-p):

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

此 sn-p 会生成以下迁移代码:

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 版本中为字符串属性创建索引?

【问题讨论】:

顺便说一句,我也提交了#1071。 【参考方案1】:

不幸的是,此时(7.0.0-beta1),在确定要使用的列类型时,不支持最大长度和列类型元数据。现在,您必须在迁移中下拉到原始 DDL。

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

【讨论】:

感谢您的信息。目前,我手动编辑生成的迁移文件,添加dataType 参数:migrationBuilder.CreateTable("Keyword", c =&gt; new Id = c.Int(nullable: false, identity: true), Word = c.String(nullable: false, maxLength: 100, dataType: "nvarchar(100)") ) .PrimaryKey("PK_Keyword", t =&gt; t.Id); 看起来您的变体也应该在生成的迁移文件中完成,而不是 OnModelCreating 重载? 正确,在迁移代码中。 (我已经澄清了我的答案。)

以上是关于如何在 Entity Framework 7 中为字符串属性创建索引的主要内容,如果未能解决你的问题,请参考以下文章

在Entity Framework Code First中为同一个表定义多个外键

如何使用 Entity Framework 7 记录查询?

Entity Framework 6 Recipes 2nd Edition(10-9)译 -> 在多对多关系中为插入和删除使用存储过程

重置 Entity Framework 7 迁移

Entity Framework Core 7.0 未来规划

使用 Entity Framework 6.1 和 MVC 5 从数据库中使用 Code First 后如何同步模型?