【问题标题】:Multiple column index on inherited, non-overridden field继承的非覆盖字段上的多列索引
【发布时间】:2016-02-02 14:08:52
【问题描述】:

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

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 设为虚拟(因此仍在所有子类中实现)并在类中覆盖它以进行多列索引定义(以及对基本实现的调用)?

亲切的问候, 伴侣

【问题讨论】:

标签: c# entity-framework inheritance multiple-columns code-first


【解决方案1】:

如果基类包含您在多列索引中需要的列,您将不得不跳过使用注释并使用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);            
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2019-12-25
    • 2021-02-11
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多