Есть ли способ создать индекс для свойства / столбца, используя сначала код вместо нового IndexAttribute
?
Есть ли способ создать индекс для свойства / столбца, используя сначала код вместо нового IndexAttribute
?
Ответы:
Что ж, 26.10.2017 Entity Framework 6.2 был официально выпущен . Он включает в себя возможность легко определять индексы через Fluent API. О его использовании уже было объявлено в бета-версии 6.2.
Теперь вы можете использовать HasIndex()
метод, а затем IsUnique()
указать, должен ли он быть уникальным индексом.
Просто небольшое сравнение (до / после), пример:
// before
modelBuilder.Entity<Person>()
.Property(e => e.Name)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute { IsUnique = true }));
// after
modelBuilder.Entity<Person>()
.HasIndex(p => p.Name)
.IsUnique();
// multi column index
modelBuilder.Entity<Person>()
.HasIndex(p => new { p.Name, p.Firstname })
.IsUnique();
Также можно отметить индекс как кластерный с помощью .IsClustered()
.
РЕДАКТИРОВАТЬ # 1
Добавлен пример для многоколоночного индекса и дополнительная информация о том, как пометить индекс как кластерный.
РЕДАКТИРОВАТЬ # 2
В качестве дополнительной информации, в EF Core 2.1 он точно такой же, как в EF 6.2 сейчас.
Вот ссылка на MS Doc.
new
. Я починю это.
В настоящее время нет «первоклассной поддержки» для создания индекса через свободный API, но вы можете сделать это через свободный API, вы можете пометить свойства как имеющие атрибуты из Annotation API. Это позволит вам добавить Index
атрибут через свободный интерфейс.
Вот несколько примеров из рабочего элемента с сайта Issues для EF.
Создайте индекс для одного столбца:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute()));
Несколько индексов в одном столбце:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("Index1"),
new IndexAttribute("Index2") { IsUnique = true }
}));
Многоколоночные индексы:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty1)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 1)));
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty2)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 2)));
Использование вышеуказанных методов приведет к тому, что .CreateIndex()
вызовы будут автоматически создаваться для вас в вашей Up()
функции при формировании следующей миграции (или будут автоматически созданы в базе данных, если вы не используете миграции).
.Primarykey(x=>x.id,clustered:false)
методе
HasAnnotation
метод, но такого метода НЕТ. но я нашел метод, имя HasColumnAnnotation
которого принимает указанные вами параметры. Вам нужно обновить свой ответ или я ошибаюсь?
Я создал несколько методов расширения и обернул их в пакет nuget, чтобы сделать это намного проще.
Установите EntityFramework.IndexingExtensions
пакет nuget.
Затем вы можете сделать следующее:
public class MyDataContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.HasIndex("IX_Customers_Name", // Provide the index name.
e => e.Property(x => x.LastName), // Specify at least one column.
e => e.Property(x => x.FirstName)) // Multiple columns as desired.
.HasIndex("IX_Customers_EmailAddress", // Supports fluent chaining for more indexes.
IndexOptions.Unique, // Supports flags for unique and clustered.
e => e.Property(x => x.EmailAddress));
}
}
Проект и исходный код здесь . Наслаждайтесь!
IndexAttribute
класс EF не предоставляет этого , поэтому я не могу включить его в свою библиотеку.
Без явного имени:
[Index]
public int Rating { get; set; }
С конкретным именем:
[Index("PostRatingIndex")]
public int Rating { get; set; }
EntityFramework
. он включен в эту сборку. просто запуталась насчет NS.
instead of using the new IndexAttribute
вы это заметили?
Начиная с EF 6.1 этот атрибут [Index]
поддерживается.
Используйте [Index(IsUnique = true)]
для уникального индекса.
Вот ссылка от Microsoft
public class User
{
public int UserId { get; set; }
[Index(IsUnique = true)]
[StringLength(200)]
public string Username { get; set; }
public string DisplayName { get; set; }
}
[Index("IX_BlogIdAndRating", 2)]
public int Rating { get; set; }
[Index("IX_BlogIdAndRating", 1)]
public int BlogId { get; set; }
Здесь ссылка от Microsoft
Entity Framework 6
Property(c => c.MyColumn)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_MyIndex")));
И добавьте, используя:
using System.Data.Entity.Infrastructure.Annotations;
using System.ComponentModel.DataAnnotations.Schema;
Вы можете использовать аннотацию данных INDEX Code First Data Annotations
Если вы не хотите использовать атрибуты в своих POCO, вы всегда можете сделать это следующим образом:
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
Вы можете выполнить этот оператор в своем DbInitializer
производном классе. Однако я не знаю, как это сделать с помощью Fluent API.
Я пишу метод расширения для использования в свободном EF, чтобы избежать лишнего кода:
public static PrimitivePropertyConfiguration HasIndexAnnotation(
this PrimitivePropertyConfiguration primitivePropertyConfiguration,
IndexAttribute indexAttribute = null
)
{
indexAttribute = indexAttribute ?? new IndexAttribute();
return primitivePropertyConfiguration
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(indexAttribute)
);
}
затем используйте это так:
Property(t => t.CardNo)
.HasIndexAnnotation();
или вот так, если индексу нужны какие-то конфиги:
Property(t => t.CardNo)
.HasIndexAnnotation(new IndexAttribute("IX_Account") { IsUnique = true });
Вы можете использовать один из этих
// Индексы
this.HasIndex(e => e.IsActive)
.HasName("IX_IsActive");
или
this.Property(e => e.IsActive).HasColumnAnnotation(
"Index",
new IndexAnnotation(new IndexAttribute("IX_IsActive")));