Чи є спосіб створити індекс у властивості / стовпці, використовуючи код-перше, замість того, щоб використовувати новий IndexAttribute
?
Чи є спосіб створити індекс у властивості / стовпці, використовуючи код-перше, замість того, щоб використовувати новий IndexAttribute
?
Відповіді:
Добре 26.10.2017 Entity Framework 6.2 був офіційно випущений . Він включає можливість легко визначати індекси за допомогою API Fluent. Але це використовувати вже було оголошено в бета-версії 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, який вільно говорить, ви можете відзначити властивості як атрибути 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
якого приймає параметри, які ви надаєте. Вам потрібно оновити свою відповідь чи я помиляюся?
Я створив декілька методів розширення і загорнув їх у пакунок, щоб зробити це набагато простіше.
Встановіть 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
. він включений у цю збірку. просто розгубився щодо НС.
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
Суб'єктна Рамка 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 Перші анотації даних
Якщо ви не хочете використовувати атрибути у своїх 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")));