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

EFのバージョン6.1.1で修正されたバグであることを理解しているので、(まだ)この問題に直面している人のために(https://entityframework.codeplex.com/workitem/1035)。

したがって、最新バージョンの EF に更新するだけで修正されるはずです。ただし、更新できなかった、または更新しない場合の回避策は、生成された移行ファイルで重複するインデックスを削除して保存するのと同じくらい簡単です (有効になっている場合は AutomaticMigrationsEnabled を無効にすることも忘れないでください)。

于 2014-09-14T00:40:12.670 に答える
1

Entity Framework が外部キーにインデックスを追加すると思われます - 外部キーは主キーでもあるため、既にインデックスが作成されている場合でも。見落としかもしれませんし、フレームワーク開発者にとって優先度が低いかもしれません。いずれにせよ、Up() メソッドを自分で調整できます。この便利なブログの項目 7 を参照してください。 エンティティ フレームワークの移行に関するヒント

于 2013-08-28T07:51:36.073 に答える
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 に答える