2015-06-09 3 views
2

Я новичок в Entity Framework и хотел бы знать, возможно ли, что я хочу сделать.Entity Framework и абстрактный класс

У меня есть класс с именем 'Monitor', который содержит список 'MonitorField'.

Каждый «MonitorField» есть список абстрактного класса под названием «AMonitoringTool» **

AMonitoringTool является обеспечить, чтобы позволить другому разработчику создать свой собственный вид поля, унаследовав от AMonitoringTool во внешней DLL.

Основная проблема заключается в том, что приложение не знает реального типа в 'MonitorField', что предотвращает сохранение моих объектов в базе данных.

У меня есть MonitorEntity с DbSet, но я не могу сохранить свой список Monitor, я получаю сообщение об ошибке:.

«абстрактного типа«{...} AMonitoringTool 'не имеет отображенный потомка, и поэтому не может быть сопоставлен ...»

Моя первая мысль была реализовать отображение в каждой DLL, которые наследуют от„AMonitoringTool“, но я не знаю, как это сделать.

MonitorEntity.cs

public class MonitorEntity : DbContext 
{ 
    public DbSet<Monitor> Monitors { get; set; } 

    public MonitorEntity() 
    { 

    } 
} 

Monitor.cs

public class Monitor 
    { 
     public Monitor(string name) 
     { 
      MonitorName = name; 
      FieldList = new List<MonitorField>(); 
     } 

     private List<MonitorField> m_fieldList = null; 
     public virtual List<MonitorField> FieldList 
     { 
      get 
      { 
       return m_fieldList; 
      } 
      set 
      { 
       m_fieldList = value; 
      } 
     } 
    } 

MonitorField.cs

public class MonitorField 
{ 
    public AMonitoringTool Configuration { get; set; } 

    public MonitorField() 
    { 
     FieldName = "<label>"; 
    } 
} 
+1

Ну что вам нужно конкретный тип для сохранения в базе данных, вы можете сделать контекст, чтобы получить общий тип параметра. – DavidG

+0

Возможно, вам удастся сохранить что-то динамическое, подобное этому, в базу данных документов. Вы также можете сериализовать элементы MonitorField для строк. – CuddleBunny

ответ

2

Вы, кажется, хотите CON чтобы получить свою собственную реализацию того, что такое AMonitoringTool. Я предлагаю вам создать свой контекст с параметром общего типа, чтобы позволить потребителю решить, что это такое. Нечто подобное должно работать:

//This isn't strictly needed but it will let you force some 
//Specific fields for the monitoring tool if you like 
public interface IMonitoringTool 
{ 
    string ForcedProperty { get; set; } 
} 

//Here the type parameter get used for the Configuration property: 
public class MonitorField<T> where T : IMonitoringTool 
{ 
    public T Configuration { get; set; } 
    public string FieldName { get; set; } 

    public MonitorField() 
    { 
     FieldName = "<label>"; 
    } 
} 

//And this is the context: 
public class MonitorEntity<T> : DbContext where T : IMonitoringTool 
{ 
    public DbSet<Monitor<T>> Monitors { get; set; } 
} 

public class Monitor<T> where T : IMonitoringTool 
{ 
    public Monitor(string name) 
    { 
     MonitorName = name; 
     FieldList = new List<MonitorField<T>>(); 
    } 

    public string MonitorName { get; set; } 
    public List<MonitorField<T>> FieldList { get; set; } 

} 

Так что теперь, если потребитель хочет контекст, они создают свой собственный класс:

public MyMonitoringTool : IMonitoringTool 
{ 
    public string ForcedProperty { get; set; } 
    public string MyCustomProperty { get; set; } 
} 

и создать свой собственный контекст:

var myContext = new MonitorEntity<MyMonitoringTool>(); 
+0

Thx для вашего ответа! У меня все еще есть опрос, ваше решение работает только в том случае, если каждый MonitorField в одном мониторе содержит тот же тип, который наследуется от AMonitoringTool? – Morgan

+0

Другой потребитель мог создать отдельную базу данных с собственной реализацией поля монитора, но каждая база данных затем была бы заблокирована после ее создания. – DavidG

+0

Хорошо, спасибо! – Morgan

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