Entity Framework继承Code First

3

我刚接触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中得到了0个ID。但是在调试时,我可以看到基类具有适当的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 吗? - Wouter de Kort
1个回答

5
处理Entity Framework中的继承时,您应该通过其父DbSet访问实体。这意味着在您的情况下,您应该通过您的DbContext上的TableA属性访问您的TableB实体。应该删除TableB属性。如果您查询TableA,则会获取所有继承自TableA的实体(在您的情况下仅为TableB实体,但可能还有更多)。如果要过滤到TableB实体,可以使用OfType方法,如下所示:
from b in context.TableA.OfType<TableB>() 
select b;

应该移除TableB属性。你的意思是从TableB中移除ID,因为它继承自TableA? - Zaki
是的,应该移除 Id 属性,但也应该在您的 DbContext 中移除 TableB 属性。 - Wouter de Kort
+1,谢谢。如果您不介意,我有一个问题 :).. 如果我有一个从TableB派生出来的TableC,它有自己的主键,但是TableB有一个外键指向TableC,我需要在TableB上指定它吗? - Zaki
1
如果C从B派生而来,它将不会有自己的ID。您需要在整个层次结构中共享ID。另外,我建议尝试丢弃表和外键的ID。您正在使用Code First。尝试以实体和关系为思考方式。只需让EF找出默认映射并在必要时进行调整即可。 - Wouter de Kort
好的,谢谢您的解释。您能解释一下失去表和外键ID的含义吗?您是指在类中仅删除外键和主键,关系就足够了吗? - Zaki
不,我的意思是你现在考虑模型的方式还是以数据库为基础。EF Code First允许你专注于你的类。 - Wouter de Kort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接