【发布时间】: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