为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Entity Framework Core 2.1 定义多字段索引

如何使用 Entity Framework Core 2.1 定义多字段索引

C#
回首忆惘然 2021-10-24 14:21:10
我正在研究 ASP.Net Core 2.1 API,我使用 Entity Framework Core 2.1。我正在使用迁移来管理对数据库的更改。我的后备数据存储是 Azure SQL Server 的一个实例。我需要将多字段非聚集索引添加到我的一个表中,但我很难在我的 google 搜索中找到有关如何执行此操作的简明参考。我尝试在 POCO 类中使用 [Index()] 数据注释,但无法识别。因此,我假设我必须在 DbContext 类的 OnModelCreating 方法中执行此操作,但我还没有找到有关如何为多字段非聚集索引执行此操作的示例。这是一个示例实体类public class H1Record : EntityBase{    [Key]    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]    public long Id { get; set; }    [ForeignKey("ShippingServicesFileId")]    public ShippingServicesFile ShippingServicesFile { get; set; }    [Required]    public int ShippingServicesFileId { get; set; }    [Column(TypeName = "varchar(20)")]    public string BatchId { get; set; }    [Column(TypeName = "varchar(34)")]    [MaxLength(34)]    public string ElectronicFileNumber { get; set; }    [Column(TypeName = "varchar(1)")]    [MaxLength(1)]    public string ElectronicFileType { get; set; }    [Column(TypeName = "varchar(8)")]    [MaxLength(8)]    public string DateOfMailing { get; set; }    [Column(TypeName = "varchar(6)")]    [MaxLength(6)]    public string TimeOfMailing { get; set; }    public DateTime MailingDateTime { get; set; }    [Column(TypeName = "varchar(1)")]    [MaxLength(1)]    public string EntryFacilityType { get; set; }    [Column(TypeName = "varchar(5)")]    [MaxLength(5)]    public string EntryFacilityZipCode { get; set; }}这是实体基类public class EntityBase{    public DateTime CreatedDate { get; set; }    public DateTime LastModifiedDate { get; set; }    public int CreatedByUserId { get; set; }    public int LastModifiedByUserId { get; set; }    public bool DeleteFlag { get; set; }}我想在我的 DbContext 的 OnModelCreating 方法中为 ShippingServicesFileId 和 DeleteFlag 创建一个非聚集索引,当我在我的包管理器控制台中运行 add-migration 时,它会被拾取。有任何想法吗?
查看完整描述

2 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

您不能在具有数据注释的多个列上创建索引,因此您必须使用 Fluent API(在 OnModelCreating 中):

modeBuilder.Entity<ENTITYCLASS>().HasIndex(x => new {x.PROPERTY1, x.PROPERTY2, ...})

创建非聚集索引。使用 .IsUnique() 创建一个唯一的。如果您想在 SQL Server 上使用聚集索引,请使用 .ForSqlServerIsClustered()。您可以选择使用 .HasName("...") 为其指定另一个名称。


查看完整回答
反对 回复 2021-10-24
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

如果这是您的首选方法,您可以在迁移期间将列作为字符串数组传入。例如

migrationBuilder.CreateIndex("IX_H1Record", "H1Record",new string[] { "ShippingServicesFileId", "DeleteFlag"}, "dbo");


查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信