在以下类中,我尝试使用抽象基类进行代码优先设置。对不起,如果这是一个重复的问题。我确实尝试搜索网站并谷歌搜索答案,但我尝试过的任何工作都没有。
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"));
}
}
答案 0 :(得分:1)
CPUObject
目前是一个抽象类,无法实例化。只需删除abstract
即可使其成为具体对象。然后,将public DbSet<CPUObject> CPUs { get; set; }
添加到您的DBContext
您目前正在收到错误,因为EF正在寻找具体的类,因此错误说您可以创建另一个继承的具体类(即'派生自')CPUObject