มีวิธีสร้างดัชนีบนคุณสมบัติ / คอลัมน์โดยใช้รหัสก่อนแทนที่จะใช้ใหม่IndexAttribute
หรือไม่?
มีวิธีสร้างดัชนีบนคุณสมบัติ / คอลัมน์โดยใช้รหัสก่อนแทนที่จะใช้ใหม่IndexAttribute
หรือไม่?
คำตอบ:
ดี 2017/10/26 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
แอตทริบิวต์ผ่านอินเทอร์เฟซที่คล่องแคล่ว
นี่คือตัวอย่างบางส่วนจากรายการงานจากไซต์ปัญหาสำหรับ 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)
method
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
ขอโทษนะที่ฉันลืมที่จะรวมถึง มันรวมอยู่ในชุดประกอบนั้น สับสนเกี่ยวกับ 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
กรอบเอนทิตี 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")));