实体框架继承代码优先

Zak*_*aki 3 polymorphism inheritance entity-framework asp.net-mvc-4

我是EF 新手,根据本教程,我设置了我的代码优先类,将基本调用TableA'sID作为主键和外键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; }
}
Run Code Online (Sandbox Code Playgroud)

在执行查询时在控制器中:

 var a = db.TableB.ToList();
Run Code Online (Sandbox Code Playgroud)

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; }
    }
Run Code Online (Sandbox Code Playgroud)

Wou*_*ort 5

在实体框架中处理继承时,您应该通过其父DbSet访问实体.这意味着在您的情况下,您应该通过您TableBTableA房产访问您的实体DbContext.该TableB属性应删除.

如果您要查询,TableA 您将获得所有继承的实体TableA(在您的情况下只有TableB实体,但可能会有更多).如果要过滤到TableB实体,可以使用如下OfType方法:

from b in context.TableA.OfType<TableB>() 
select b;
Run Code Online (Sandbox Code Playgroud)