首先是实体框架继承代码



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

相关内容

  • 没有找到相关文章