C# EF代码优先:反规范化继承的类型

C# EF代码优先:反规范化继承的类型,c#,entity-framework,entity-framework-4.1,ef-code-first,code-first,C#,Entity Framework,Entity Framework 4.1,Ef Code First,Code First,我拥有以下实体: Human -Name -Age -Height -Weight 人类 -名字 -年龄 -高度 -重量 超人 -超级大国 EF正在创建仅具有Power属性的SuperHumans表,并且在查询时连接到Humans表。我要超人表上的所有列 EF 4.1代码是否可以首先配置为执行此操作?执行此操作的一种方法是将关系设置为Has-a关系,而不是is-a关系 public class SuperHuman { public Human TheHuman { get; s

我拥有以下实体:

Human -Name -Age -Height -Weight 人类 -名字 -年龄 -高度 -重量 超人 -超级大国 EF正在创建仅具有Power属性的SuperHumans表,并且在查询时连接到Humans表。我要超人表上的所有列


EF 4.1代码是否可以首先配置为执行此操作?

执行此操作的一种方法是将关系设置为Has-a关系,而不是is-a关系

public class SuperHuman
{
    public Human TheHuman { get; set; }
    public string SuperPower { get; set; }
}
生成的数据库表应该包含所有的Human和SuperHuman字段(只要您没有单独的Human表,在这种情况下,将创建一个单独的Human表,并添加一个外键将这些表链接在一起)

它的实用性有限,因为它破坏了继承。你可能会找到更好的解决办法


编辑:您可以执行以下操作:

public class SuperHuman : Human
{
    public string Name 
    { 
        get { return base.Name; } 
        set { base.Name = value; } 
    }
}


注意:这没有经过测试,可能不是最好的解决方案。我把它包括在这里只是作为一个可能的解决方案。

难道不让人类部分工作吗??如果这不起作用,只需查看每个层次结构的表、每个类型的表和每个具体类型的表(TPH、TPT、TPC)。您当前正在使用TPT,并且希望使用TPC。

我只需要将超人配置为映射继承属性,如下所示:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SuperHuman>().Map(m => m.MapInheritedProperties());
    {
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Map(m=>m.MapInheritedProperties());
{

不幸的是,我确实有一个Humans表。我不介意在应用程序中破坏继承。好建议。我想要两个不同的实体。哦,我明白了。然后放入partial并继续使用TPT。我相信这应该可以做到。不过,公平地说,我已经有一段时间没有这样做了:P。让我知道。
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SuperHuman>().Map(m => m.MapInheritedProperties());
    {