4

对于某些实体,我有一个使用表类型继承的简单模型。问题是当我使用 Add-Migration 生成迁移时,它会在子类的主键上创建一个重复的索引。

类定义:

class Product
{
    [Key]
    public int ProductId { get; set; }
    public int Value { get; set; }
}
class Service : Product
{
    public int OtherValue { get; set; }
}

在我的上下文中,我为两个类指定了表名

class ProductContext : DbContext
{
    virtual public DbSet<Product> ProductSet { get; set; }
    virtual public DbSet<Service> ServiceSet { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Product>().ToTable("Product");
        modelBuilder.Entity<Service>().ToTable("Service");
    }
}

运行 Add-Migration 会产生以下结果:

public override void Up()
{
    CreateTable(
        "dbo.Product",
        c => new
            {
                ProductId = c.Int(nullable: false, identity: true),
                Value = c.Int(nullable: false),
            })
        .PrimaryKey(t => t.ProductId);

    CreateTable(
        "dbo.Service",
        c => new
            {
                ProductId = c.Int(nullable: false),
                OtherValue = c.Int(nullable: false),
            })
        .PrimaryKey(t => t.ProductId)
        .ForeignKey("dbo.Product", t => t.ProductId)
        .Index(t => t.ProductId);

}

当它已经是主键时,它会在 Service.ProductId 上创建一个附加索引。为了防止添加索引,我是否缺少一些注释?

使用 EF5 和 EF6 进行测试,结果相同。

4

3 回答 3

1

我怀疑实体框架会为外键添加索引——即使外键已经被索引,因为它也是主键。也许这是一个疏忽,或者可能是框架开发人员的低优先级。无论哪种方式,您都可以自己调整 Up() 方法。请参阅此有用博客上的第 7 项实体框架迁移提示

于 2013-08-28T07:51:36.073 回答
1

只是为谁(仍然)面临这个问题,据我所知,这是 EF 版本 6.1.1 中修复的错误(https://entityframework.codeplex.com/workitem/1035)。

因此,只需更新到最新版本的 EF 即可修复它。但是,如果您不能或不会更新,解决方法就像删除生成的迁移文件中的重复索引并保存一样简单(如果启用,也不要忘记禁用 AutomaticMigrationsEnabled)。

于 2014-09-14T00:40:12.670 回答
0

尝试使两个表都继承自抽象类,如此处所述

public abstract class ProductBase
{
  [Key]
  public int ProductId { get; set; }
}

public class Product: ProductBase
{
  public int Value { get; set; }
}

public class Service : ProductBase
{
    public int OtherValue { get; set; }
}
于 2013-08-17T21:30:56.350 回答