【问题标题】:Inheritance EF Code-First继承 EF 代码优先
【发布时间】:2012-03-27 17:57:33
【问题描述】:

我有一个基础对象,我不想将其作为实体映射到 DB 中,我只想将属性添加到映射到 DB 中的对象中:

未映射对象(不知道是否重要,但基本对象在另一个程序集中):

public class BaseObject
{
    public virtual string Prop1 { get; set; }
    public virtual string Prop2 { get; set; }
}

映射对象:

public class ChildObject : BaseObject
{
    public virtual string Prop3 { get; set; }
    public virtual string Prop4 { get; set; }
    public virtual string Prop5 { get; set; }
}

DbContext 中注册了什么

  public DbSet<ChildObject> ChildObjects { get; set; }

我想在 Db 中看到什么

table:ChildObject 
    col:Prop1 (from BaseObject)
    col:Prop2 (from BaseObject)
    col:Prop3 
    col:Prop4 
    col:Prop5

要恢复,我想做的是在 Db 中拥有一个具有子属性和基本属性的表。

这是我目前遇到的错误:

类型“namespace.ChildObject”未映射。检查类型 没有通过使用 Ignore 方法明确排除或 NotMappedAttribute 数据注释。验证类型是否已定义 作为一个类,不是原始的、嵌套的或泛型的,并且不继承 来自实体对象。

我一直在挖掘,但找不到如何做到这一点。

有什么想法吗?

编辑:

@Kyle Trauberman 是对的,但是,由于某种原因,从不同程序集中的基类继承似乎存在问题。我就是这么做的。

class BaseObjectClone : BaseObject { } /* BaseObject being in another assembly */

public class ChildObject : BaseObjectClone {
    public virtual string Prop3 { get; set; }
    public virtual string Prop4 { get; set; }
    public virtual string Prop5 { get; set; }
}

【问题讨论】:

  • 那么,您不想将基类中定义的属性映射到数据库吗?还是您希望它们映射?您现在看到的与您想看到的相比?
  • 抱歉,可能不清楚。我的意思是我不希望将基础对象映射为不同的实体,但我希望属性显示在子对象中。
  • 我的回答here 解决了我的类似情况

标签: c# .net entity-framework code-first fluent-interface


【解决方案1】:

Morteza Manavi 有一篇博文详细介绍了如何做到这一点:

http://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx

基本上,您需要覆盖 DbContext 中的 OnModelCreating 并为每个子表调用 MapInheritedProperties()

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<BankAccount>().Map(m =>
    {
        m.MapInheritedProperties();
        m.ToTable("BankAccounts");
    });

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

【讨论】:

  • Morteza 有一系列关于继承的文章,你应该看看。这是第 1 部分:weblogs.asp.net/manavi/archive/2010/12/24/…
  • 我已经阅读了这篇文章,但也许​​我遗漏了一些东西,因为它仍然在“ChildObject”上抛出错误
  • 我收到以下错误。但是当我删除继承时,一切都很好。未映射类型“namespace.ChildObject”。使用 Ignore 方法或 NotMappedAttribute 数据注释检查该类型是否被显式排除。验证该类型是否被定义为一个类,不是原始的、嵌套的或泛型的,并且不是从 EntityObject 继承的。
  • 感谢您撰写带有链接的答案that I can actually upvote.
  • @Burnzy 我只是尝试根据您发布的代码重新创建它,但默认生成的表包含来自基类和子类的属性。没有为基类生成单独的表。您能否发布完整的 dbcontext 和模型类,而不是您发布的淡化示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多