Entity framework 实体框架继承代码优先
我是EF的新手,因此我设置了我的code first类,将基本调用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
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意味着什么吗。你是说在类中只删除外键和主键,关系就足够了吗?