2016-06-23 5 views
1

В следующих классах я пытаюсь выполнить первую настройку кода с использованием абстрактных базовых классов. Извините, если это дублированный вопрос. Я попытался выполнить поиск на сайте и Google для ответа, но ничто из того, что я пробовал, не сработало.C# Entity Framework Code First Abstract Inheritance

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: 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.

Как изменить 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' в ваш контекст. – DavidG

ответ

1

CPUObject в настоящее время является абстрактным классом, который не может быть реализован. Просто удалите abstract, чтобы сделать его конкретным объектом. Затем добавьте public DbSet<CPUObject> CPUs { get; set; } к вашему DBContext

Вы в настоящее время получаю ошибку, потому что EF ищет конкретного класса, так что ошибка говорит, что вы можете сделать еще один конкретный класс, который наследует (т.е. «вытекающих из») CPUObject

+0

CPUObject, MemoryObject и StorageObject никогда не должны были быть абстрактными. Это была ошибка. –

Смежные вопросы