Entity framework 实体框架继承代码优先

Entity framework 实体框架继承代码优先,entity-framework,asp.net-mvc-4,inheritance,polymorphism,Entity Framework,Asp.net Mvc 4,Inheritance,Polymorphism,我是EF的新手,因此我设置了我的code first类,将基本调用TableA的ID作为TableB的主键和外键,如下所示: [Table("TableA")] public abstract class TableA { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int ID { get; set; } public string Description

我是EF的新手,因此我设置了我的code first类,将基本调用
TableA的
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。所以我做了一个循环,并在循环中使用
item.ID=((TableA)(item)).ID分配ID

上面的工作原理是分配ID,以便我可以在视图中看到它们,但这是正确的方法吗?还有其他解决办法吗

编辑: 以下是dbcontext:

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

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

        public DbSet<TableB> TableB { get; set; }
    }
公共类上下文:DbContext
{
公共产品上下文()
:base(“默认连接”)
{
}
公共数据库集表a{get;set;}
公共DbSet TableB{get;set;}
}

在实体框架中处理继承时,应通过其父数据库集访问实体。这意味着您应该通过
DbContext
上的
TableA
属性访问
TableB
实体。应删除表B的
属性

如果您要查询
TableA
,您将获得从
TableA
继承的所有实体(在您的情况下,只有
TableB
实体,但可能还有更多)。 如果要向下筛选到
表B
实体,可以使用
of type
方法,如下所示:

from b in context.TableA.OfType<TableB>() 
select b;
来自context.TableA.OfType()中的b
选择b;

你能显示你的DbContext吗?@WouterdeKort请看我的编辑“TableB属性应该被删除”。你的意思是说ID应该从TableB中删除,因为它继承自TableA?是的,ID属性应该被删除,但是DbContext+1上的TableB属性也可以删除,谢谢。如果你不介意的话,我有个问题:)。。如果从TableB派生的TableC有自己的主ID,但TableB有TableC的外键,我需要在TableB上指定它吗?如果C从B派生,它将没有自己的ID。您需要在整个层次结构中共享ID。另一方面,我会尝试丢失表和外键的ID。您首先使用的是代码。试着在实体和关系中思考。只需让EF计算出默认映射,并在必要时尝试进行调整OK感谢您的解释,您能解释一下失去表和外键的ID意味着什么吗。你是说在类中只删除外键和主键,关系就足够了吗?