3

我是 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; }
}

在控制器中进行查询时:

 var a = db.TableB.ToList();

对于 tableB ID,我得到 0。但是在调试时,我可以看到具有适当 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

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

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

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