4

От EF6.1, у нас есть способ указания кластерный индекс на свойствеКак создать индекс кластерного с Entity Framework Ядро

public class Person 
{ 
    [Index(IsClustered = true, IsUnique = true)] 
    public long UserName { get; set; } 
} 

Но этот атрибут Index, кажется, не быть в EF Ядра право Теперь? Или как это сделать в EF Core для достижения этого? Спасибо.

+0

Образцы свободно Апи для индексов см в https://www.learnentityframeworkcore.com/configuration/fluent- api/hasindex-method –

ответ

11

Из текущей документации EF Основной - Indexes раздел:

аннотаций

данных

Индексы не могут быть созданы с помощью аннотаций данных.

Но наверняка вы можете указать, что с помощью Fluent API (обратите внимание на методы расширения, имеющие ForSqlServer префикс, который, кажется, чтобы обозначить SQLSERVER специфические особенности):

modelBuilder.Entity<Person>() 
    .HasIndex(e => e.UserName) 
    .IsUnique() 
    .ForSqlServerIsClustered(); 
+0

Существует ли конкретная версия для MySql для '.ForSqlServerIsClustered();'? – Zze

+1

@Zze Так как каждый обеспечивает добавляет свои собственные методы расширения, и в настоящее время [несколько провайдеров MySql для EF Core] (https://docs.microsoft.com/en-us/ef/core/providers/), вы должны проверить тот, который вы используете. Я бы посмотрел на методы расширения, глядя на «ForMySql». –

0

В отсутствие встроенной поддержки, вы может использовать пользовательский атрибут вашего собственного аннотировать свойства модели и применять в OnModelCreating():

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    foreach (var entity in modelBuilder.Model.GetEntityTypes()) 
    { 
     foreach (var prop in entity.GetProperties()) 
     { 
      var attr = prop.PropertyInfo.GetCustomAttribute<IndexAttribute>(); 
      if (attr != null) 
      { 
       var index = entity.AddIndex(prop); 
       index.IsUnique = attr.IsUnique; 
       index.SqlServer().IsClustered = attr.IsClustered; 
      } 
     } 
    } 
} 

с помощью простого класса атрибута маркера:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class IndexAttribute : Attribute 
{ 
    public bool IsUnique { get; set; } 
    public bool IsClustered { get; set; } 
} 

Затем в классе модели, просто добавьте атрибут, чтобы создать вторичный индекс:

public class User 
{ 
    public int UserId { get; set; } 
    [Index(IsUnique = true, IsClustered = true)] 
    public string Nickname { get; set; } 
} 
Смежные вопросы