【问题标题】:C# Entity Framework Code First Abstract InheritanceC#实体框架代码优先抽象继承
【发布时间】:2016-06-23 23:00:15
【问题描述】:

在以下类中,我尝试使用抽象基类进行代码优先设置。对不起,如果这是一个重复的问题。我确实尝试搜索该网站并在谷歌上搜索答案,但我尝试过的没有任何效果。

public abstract class IDObject
{
    [Key]
    public Int32 ID { get; internal set; }
}

public abstract class NamedObject : IDObject
{
    public String Name { get; set; }
}

public abstract class HWObject : NamedObject
{
    public Double Free { get; set; }
    public Double Max { get; set; }
    public Double Used { get; set; }
}

public abstract class CPUObject : HWObject { }
public abstract class MemoryObject : HWObject { }
public abstract class StorageObject : HWObject { }

public class Server : NamedObject
{
    [JsonConstructor]
    internal Server() { }
    public String CompanyName { get; set; }
    public Boolean IsRunning { get; set; }
    public CPUObject CPU { get; set; }
    public MemoryObject Memory { get; set; }
    public StorageObject Storage { get; set; }
}

我有以下 DBContext:

public class DataContext : DbContext
{
    public DataContext() : base("name=DataContext") { }

    public DbSet<Server> Servers { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    }
}

当我尝试查看只读数据模型时,我收到以下错误:

System.InvalidOperationException:抽象类型“MyApp.CPUObject”没有映射的后代,因此无法映射。从模型中删除“MyApp.CPUObject”或将派生自“MyApp.CPUObject”的一种或多种类型添加到模型中。

如何更改 DBContext 以使错误消失?

编辑: 根据下面的答案,我已经从 CPUObject、MemoryObject 和 StorageObject 中删除了抽象,因为它们本不应该是抽象的。

我已将 DBContext 更改为以下内容:(映射创建 1 对 1 关系)

public class DataContext : DbContext
{
    public DataContext() : base("name=DataContext") { }

    public DbSet<Server> Servers { get; set; }

    public DbSet<CPUObject> CPUObjects { get; set; }
    public DbSet<MemoryObject> MemoryObjects { get; set; }
    public DbSet<StorageObject> StorageObjects { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Server>().HasRequired(u => u.CPU).WithRequiredDependent().Map(m => m.MapKey("CPUID"));
        modelBuilder.Entity<Server>().HasRequired(u => u.Memory).WithRequiredDependent().Map(m => m.MapKey("MemoryID"));
        modelBuilder.Entity<Server>().HasRequired(u => u.Storage).WithRequiredDependent().Map(m => m.MapKey("StorageID"));
    }
}

【问题讨论】:

  • CPUObject 添加到您的上下文中。

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


【解决方案1】:

CPUObject 目前是一个抽象类,无法实例化。只需删除 abstract 即可使其成为具体对象。然后,将public DbSet&lt;CPUObject&gt; CPUs { get; set; } 添加到您的DBContext

您当前收到错误是因为 EF 正在寻找一个具体类,因此该错误表明您可以创建另一个继承(即“派生自”)CPUObject 的具体类

【讨论】:

  • CPUObject、MemoryObject 和 StorageObject 从来都不是抽象的。这是一个错误大声笑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多