C#实体框架代码第一个抽象继承

时间:2016-06-23 23:00:16

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

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

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"));
    }
}

1 个答案:

答案 0 :(得分:1)

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

您目前正在收到错误,因为EF正在寻找具体的类,因此错误说您可以创建另一个继承的具体类(即'派生自')CPUObject