C# 在EF4.4中只需要TPT继承的一个子项时,如何避免首先在代码中映射TPT继承的所有子项?

C# 在EF4.4中只需要TPT继承的一个子项时,如何避免首先在代码中映射TPT继承的所有子项?,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我的系统中已经实现了每种类型的表继承。这是从我们在这个应用程序中使用的主框架中使用的,所以我们不应该修改这个结构,但是,不时会实现新的子结构 到目前为止,我们不需要直接从我们的业务服务和类中引用这些模型,但突然之间我们为其中一个引用了这些模型。我们有一个“ContentItem”表作为父表,大约有15个表作为子表。我只需要使用一个孩子(作为结果,一个家长) 在我们首先使用EF代码时,我定义了子级所需的映射 modelBuilder.Entity<ContentItemC&g

我的系统中已经实现了每种类型的表继承。这是从我们在这个应用程序中使用的主框架中使用的,所以我们不应该修改这个结构,但是,不时会实现新的子结构

到目前为止,我们不需要直接从我们的业务服务和类中引用这些模型,但突然之间我们为其中一个引用了这些模型。我们有一个“ContentItem”表作为父表,大约有15个表作为子表。我只需要使用一个孩子(作为结果,一个家长)

在我们首先使用EF代码时,我定义了子级所需的映射

        modelBuilder.Entity<ContentItemC>().ToTable("ContentItemC");
        modelBuilder.Entity<ContentItemC>().HasKey(c => c.ContentItemId);
        modelBuilder.Entity<ContentItemC>().HasRequired(c => c.AnotherModel).WithMany().HasForeignKey(c => c.AnotherModel);
modelBuilder.Entity().ToTable(“ContentItemC”);
modelBuilder.Entity().HasKey(c=>c.ContentItemId);
modelBuilder.Entity().HasRequired(c=>c.AnotherModel)。WithMany().HasForeignKey(c=>c.AnotherModel);
问题是,一旦我这样做了,我还需要映射父表,因为我需要使用一些关系到引用在父表中的其他模型(例如ContentItemTag)。所以我这样做:

modelBuilder.Entity<ContentItem>().ToTable("ContentItem");
            modelBuilder.Entity<ContentItem>().HasKey(q => q.ContentItemId);
            modelBuilder.Entity<ContentItem>().Ignore(ci => ci.FeatureLevel);
            modelBuilder.Entity<ContentItem>().HasRequired(q => q.Status).WithMany().HasForeignKey(q => q.StatusID);
            modelBuilder.Entity<ContentItem>().HasMany(q => q.Tags).WithMany()
                .Map(m => m.MapLeftKey("ContentItemId").MapRightKey("TagID").ToTable("ContentItemTag"));
modelBuilder.Entity().ToTable(“ContentItem”);
modelBuilder.Entity().HasKey(q=>q.ContentItemId);
modelBuilder.Entity().Ignore(ci=>ci.FeatureLevel);
modelBuilder.Entity().HasRequired(q=>q.Status).WithMany().HasForeignKey(q=>q.StatusID);
modelBuilder.Entity().HasMany(q=>q.Tags).WithMany()
.Map(m=>m.MapLeftKey(“ContentItemId”).mapreghtKey(“TagID”).ToTable(“ContentItemTag”);
但当“问题”出现的时候。每次我尝试从/向EF上下文获取或添加ContentItemC时,应用程序都会中断,说找不到某些属性。有趣的是,这些是在其他子模型中定义的属性。看起来,当首先将父模型添加到代码中时,我还需要映射其余的模型。一旦我这样做:

  modelBuilder.Entity<ContentItemA>().ToTable("ContentItemA");
            modelBuilder.Entity<ContentItemA>().HasKey(c => c.ContentItemId);

  modelBuilder.Entity<ContentItemB>().ToTable("ContentItemB");
            modelBuilder.Entity<ContentItemB>().HasKey(c => c.ContentItemId);

  modelBuilder.Entity<ContentItemD>().ToTable("ContentItemD");
            modelBuilder.Entity<ContentItemD>().HasKey(c => c.ContentItemId);

etc.
modelBuilder.Entity().ToTable(“ContentItemA”);
modelBuilder.Entity().HasKey(c=>c.ContentItemId);
modelBuilder.Entity().ToTable(“ContentItemB”);
modelBuilder.Entity().HasKey(c=>c.ContentItemId);
modelBuilder.Entity().ToTable(“ContentItemD”);
modelBuilder.Entity().HasKey(c=>c.ContentItemId);
等
将这些引用添加到我之前不需要在代码中声明的模型中,并且应用程序不会直接使用(但在尝试使用“ContentItemC”时会中断),这看起来很糟糕。除此之外,问题是每次添加ContentItem“X”时,我们都必须在OnModelCreating方法中为其添加一个伪声明。更糟糕的是,它只会在尝试访问ContentItemC时生成运行时错误,因此很容易忘记首先更新代码,特别是对于那些没有从事ContentItemC业务的人

我曾想过通过反射生成这些modelBuilder规则,但我也不认为这是一个安全、干净的解决方案(我认为这将是一个相当神秘的解决方案)


有什么建议吗?谢谢

呃…我的头疼。你能加上你的POCO吗?或者是你想要的POCO。完成。当然,其他子级也有其他字段,但其中一些字段的名称可能相同(例如Title、IsActive)。您是否考虑过对公共属性使用复杂属性类型或抽象类?我想你需要复杂的类型,关键是不要修改我需要创建的模型(ContentItemC)中的任何其他模型。进行这些修改将影响框架使用它们的方式。第一个问题是我不应该直接从我的应用程序中处理ContentItems,但是因为我被要求不修改框架结构,所以我正在使用这种变通方法。一切都很完美,但我担心这个解决方案的可维护性/可能的错误,因为我需要明确声明所有子类映射。如果我能避免这种情况,我的担忧就会得到解决。