我有一些属性和行为的基类。许多其他类都扩展/继承了此基类。这些类中的某些应该在其自己的属性之一和基类的一个属性上创建唯一的多列索引。

public class BaseClass
{
    long employeeId {get; set;}
    // and many other things...
}

public class Buzzword : BaseClass
{
    string Name {get;set;} // supposed to be unique for every employee
    // many other things...
}


我现在想要的就是这样,重复我的Buzzword类:

public class Buzzword : BaseClass
{
    [Index("IX_Buzzword_EmployeeId_Name", IsUnique = true, Order = 1]
    // black magic: inherited property of BaseClass
    [Index("IX_Buzzword_EmployeeId_Name", IsUnique = true, Order = 2]
    string Name {get;set;} // supposed to be unique for every employee
    // many other things...
}


我怎样才能做到这一点?使employeeId虚拟(因此仍在所有子类中实现)并在类中为多列索引定义(以及对基本实现的调用)覆盖它?

亲切的问候,
伴侣

最佳答案

如果基类包含在多列索引中需要的列,则将不得不跳过使用批注并使用EntityTypeConfiguration进行映射的情况。

因此,在您的DbContext中,您可以执行以下操作:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BuzzWord>().Property(b => b.EmployeeId).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Buzzword_EmployeeId_Name", 1)));
        modelBuilder.Entity<BuzzWord>().Property(b => b.Name).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Buzzword_EmployeeId_Name", 2)));
        base.OnModelCreating(modelBuilder);
    }


或者,如果您不喜欢用大量的映射代码污染DbContext,则可以创建一个映射类,并告诉您的上下文加载所有这些类:

public class BuzzWordMapping : EntityTypeConfiguration<BuzzWord>
{
    public BuzzWordMapping()
    {
        Property(b => b.EmployeeId).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Buzzword_EmployeeId_Name", 1)));
        Property(b => b.Name).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Buzzword_EmployeeId_Name", 2)));
    }
}


然后,您的OnModelCreating将如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //  This should include any mappings defined in the same assembly as the BuzzWordMapping class
        modelBuilder.Configurations.AddFromAssembly(typeof(BuzzWordMapping).Assembly);
        base.OnModelCreating(modelBuilder);
    }

10-08 13:26