2016-06-23 9 views
1

以下のクラスでは、抽象基本クラスを使用してコードを最初にセットアップしようとしています。申し訳ありませんが、これは重複した質問です。私はサイトとGoogleの回答を検索しようとしましたが、何も試したことがありませんでした。私はDBContextを変更するにはどうすればよいC#エンティティフレームワークコード最初の抽象継承

System.InvalidOperationException: The abstract type 'MyApp.CPUObject' has no mapped descendants and so cannot be mapped. Either remove 'MyApp.CPUObject' from the model or add one or more types deriving from 'MyApp.CPUObject' to the model.

:私は、私は次のエラーを取得する読み取り専用のデータモデルを表示しようとすると

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

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    } 
} 

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を持っていますエラーが消えてしまうのですか?

EDIT: 以下の回答によれば、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

追加をCPUObject 'CPUObject'をあなたのコンテキストに追加します。 – DavidG

答えて

1

CPUObjectは現在インスタンス化できない抽象クラスです。 abstractを削除して、それを具体的なオブジェクトにしてください。 EFは、具体的なクラスを探しているため、エラーがあなたが(「から派生する」IE)を継承する別の具体的なクラスを作ることができると言うので、次に、あなたのDBContext

public DbSet<CPUObject> CPUs { get; set; }を追加するあなたは現在、エラーを取得している

+0

CPUObject、MemoryObject、およびStorageObjectは決して抽象的ではありませんでした。それは間違いだった。 –

関連する問題