SQL Entity Framework индексирует через наследование с опцией включения столбца

#c# #sql #entity-framework #indexing

#c# #sql #entity-framework #индексирование

Вопрос:

Я прихожу сегодня из-за проблем с производительностью, которые у меня есть. Сейчас я работаю над индексами, однако я не могу найти правильный способ поместить индекс во все наследования классов.. У меня есть этот фрагмент кода:

 public abstract class BaseEntityWithId
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; } = new Guid();

    [Required]
    public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;

    public DateTimeOffset? UpdatedAt { get; set; } = DateTimeOffset.UtcNow;
}

[Table("AccountExampleEntity")]
public class AccountExampleEntity : BaseEntityWithId
{
    public string UserName { get; set; }

    public string Password { get; set; }

    public Guid UserId { get; set; }

    public Guid DeviceId { get; set; }

    [ForeignKey("UserId")]
    public virtual UserEntity User { get; set; }

    [ForeignKey("DeviceId")]
    public virtual DeviceEntity Device { get; set; }
}
  

На основе этого кода Azure создает предупреждение и сообщает мне следующее:

  • Тип индекса
    • НЕКЛАСТЕРИЗОВАННЫЙ
  • Схема
    • [dbo]
  • Таблица
    • [AccountExampleEntity]
  • Ключевые столбцы индекса
    • [Идентификатор пользователя]
  • Включенные столбцы
    • [createdAt], [DeviceID], [updatedAt]

Итак, основываясь на этом, я хочу создать индекс, который я разделю на эти 4 свойства, однако я не могу найти правильный способ достичь этого .. Единственный способ, который я нашел, это воссоздать свойство, «скрыв унаследованные элементы». Это код:

 [Table("AccountExampleEntity")]
public class AccountExampleEntity : BaseEntityWithId
{
    public string UserName { get; set; }

    public string Password { get; set; }

    [Index("AccountExampleIndex", Order = 1)]
    public Guid UserId { get; set; }

    [Index("AccountExampleIndex", Order = 2)]
    public Guid DeviceId { get; set; }    

    [Index("AccountExampleIndex", Order = 3)]
    public new DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;

    [Index("AccountExampleIndex", Order = 4)]
    public new DateTimeOffset? UpdatedAt { get; set; } = DateTimeOffset.UtcNow;

    [ForeignKey("UserId")]
    public virtual UserEntity User { get; set; }

    [ForeignKey("DeviceId")]
    public virtual DeviceEntity Device { get; set; }
}
  

Это правильный способ сделать это или нет? Я ничего не смог найти в stackoverflow и EF6, когда проверял в прошлый раз, но сегодня я снова вхожу в это, и мне нужно знать 🙂

Спасибо за помощь!