3

私はEFを初めて使用し、このチュートリアルTableA'sに従って、以下のようにベースコールIDをプライマリおよび外部キーとして持つようにコードファーストクラスを設定しましたTableB:

[Table("TableA")]
public abstract class TableA
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string Description { get; set; }
}

[Table("TableB")]
public class TableB: TableA
{
    [Key]
    public int ID { get; set; }        
    public int Width { get; set; }
}

クエリを実行するときのコントローラーで:

 var a = db.TableB.ToList();

tableB ID に対して 0 を取得します。しかし、デバッグ中に、適切な ID を持つ基本クラスを確認できます。そのため、ループを実行し、その中で を使用して ID を割り当てましitem.ID = ((TableA)(item)).ID;た。

上記は ID を割り当てて自分のビューで確認できるように機能しますが、これは正しい方法ですか? 他の解決策はありますか?

編集: ここにdbcontextがあります:

public class Context : DbContext
    {
        public ProductContext()
            : base("DefaultConnection")
        {
        }

        public DbSet<TableA> TableA { get; set; }

        public DbSet<TableB> TableB { get; set; }
    }
4

1 に答える 1

5

Entity Framework で継承を扱う場合は、エンティティの親 DbSet を介してエンティティにアクセスする必要があります。これは、あなたの場合、のプロパティを介してTableBエンティティにアクセスする必要があることを意味します。プロパティを削除する必要があります。TableADbContextTableB

クエリを実行するTableA と、継承するすべてのエンティティが取得さTableAれます (この場合はエンティティのみTableBですが、さらに存在する可能性があります)。TableBエンティティに絞り込みたい場合は、次のOfTypeような方法を使用できます。

from b in context.TableA.OfType<TableB>() 
select b;
于 2013-09-17T09:31:44.587 に答える