我是Entity Framework的新手,想知道我想做什么是可能的。
我有一个名为“监视器”的类,其中包含一个“ MonitorField ”列表。
每个' MonitorField '都有一个名为'AMonitoringTool'的抽象类的列表**
提供了允许其他开发人员通过继承外部DLL中的 AMonitoringTool 来创建自己的字段的AMonitoringTool 。
主要问题是应用程序不知道“ MonitorField ”中的实际类型,因此无法将对象保存在数据库中。
我有一个带有 DbSet 的 MonitorEntity ,但我无法保存我的监控列表,我收到此错误消息:
“抽象类型'{...}。 AMonitoringTool '没有映射的后代,因此无法映射......”
我的第一个想法是在每个继承自“ AMonitoringTool ”的DLL中实现映射,但我不知道怎么做。
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>";
}
}
答案 0 :(得分:2)
您似乎希望此库的使用者拥有自己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>();