【问题标题】:The entity type EntityBase is not part of the model for the current context实体类型 EntityBase 不是当前上下文模型的一部分
【发布时间】:2014-03-29 06:37:59
【问题描述】:

我正在使用 EF 6 并且有以下内容

public class Title : EntityBase
{

    public short Id { get; set; }
    public string TitleName { get; private set; }

}
 public abstract class EntityBase
{
    public DateTime CreatedDate { get; set; }

} 

而 DbContext 包含

public DbSet<Title> Titles { get; set; }

还有

modelBuilder.Entity<Title>().Map(m =>
       {
           m.MapInheritedProperties();
           m.ToTable("Titles");
       });

但在尝试访问标题时,我得到“实体类型 EntityBase 不是当前上下文模型的一部分。”在 NuGet 控制台中运行 Update-Database 后,我看到在数据库中创建了表“标题”,其中所有字段(id、titlename、createddate)都符合预期。如果可能,我不想在 DbContext 中添加 EntityBase 数据库集。请帮助我找到解决方案。

【问题讨论】:

    标签: c# entity-framework ef-code-first


    【解决方案1】:

    MapInheritedProperties 用于建模每个具体类型的表 (TPC) 映射,即每个类的完整表。您可以这样做,但您还必须配置基类。

    modelBuilder.Entity<EntityBase>();
    

    但是,我宁愿删除MapInheritedProperties 语句并单独映射每个类。如果您映射 TPC 映射,您将永远无法在模型的其他类之间映射其他继承关联。

    【讨论】:

    • 谢谢,但如果我包含 EntityBase,我需要定义我不想在基类中做的关键字段。即使我将 Id 字段移动到 EntityBase 并尝试更新 db,它也会抛出“无法按定义映射‘标题’类型,因为它映射了使用实体拆分或其他形式继承的类型的继承属性。要么选择不同的继承映射策略以便不映射继承的属性,或者更改层次结构中的所有类型以映射继承的属性并且不使用拆分。"。
    • 我也尝试在 EntityBase 中删除抽象修饰符,但没有帮助。我的要求是 TPC 在一些但主要是从 EntityBase 继承的 TPT。不可能吗?
    • 按照我的建议,您删除了MapInheritedProperties 语句是什么意思?您的类可以从其他类继承,但 EF 不需要知道这一点。
    • 我也尝试了一个,它再次回到方形“实体类型 EntityBase 不是当前上下文模型的一部分。”我只是删除了 m.MapInheritedProperties();从我上面的例子。 Update-Database 确实可以工作,并且 db 模式很好。访问 DbSet 时出现问题。
    • 我可以在示例项目中使用您的类,而不是告诉 EF 基类和创建标题。我认为还有一些我看不到的问题。
    猜你喜欢
    • 2013-11-10
    • 2014-11-30
    • 2017-06-19
    • 2011-06-26
    • 2014-01-08
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多