我是 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();
我得到 0 表B ID。但是在调试时,我可以看到基类具有适当的 ID。所以我做了一个循环,并在其中使用 item.ID = ((TableA)(item)).ID;
分配了 ID。
上述工作方式就像它分配 ID 一样,所以我可以在我的视图中看到它们,但这是正确的方法吗?还有其他解决方案吗?
编辑:下面是数据库上下文:
public class Context : DbContext
{
public ProductContext()
: base("DefaultConnection")
{
}
public DbSet<TableA> TableA { get; set; }
public DbSet<TableB> TableB { get; set; }
}
在实体框架中处理继承时,应通过实体的父 DbSet 访问实体。这意味着在您的情况下,您应该通过DbContext
上的TableA
属性访问您的TableB
实体。应删除TableB
属性。
如果要查询TableA
则会获得从TableA
继承的所有实体(在您的情况下,只有TableB
实体,但可能还有更多)。如果要筛选到TableB
实体,可以使用如下所示的OfType
方法:
from b in context.TableA.OfType<TableB>()
select b;