C# 实体框架与抽象类
我是实体框架的新手,我想知道我想做的事情是否可行 我有一个名为“Monitor”的类,其中包含“MonitorField”的列表 每个“MonitorField”都有一个名为“AMonitoringTool”的抽象类列表** AMonitoringTool允许其他开发人员通过继承外部DLL中的AMonitoringTool来创建自己类型的字段 主要问题是应用程序不知道“MonitorField”中的实际类型,因此无法将我的对象保存到数据库中 我有一个带有数据库集的监视器实体,但我无法保存监视器列表,我收到以下错误消息: “抽象类型“{…}.AMonitoringTool”没有映射的子体,因此无法映射…” 我的第一个想法是在继承自“AMonitoringTool”的每个DLL中实现映射,但我不知道如何实现 监控实体.csC# 实体框架与抽象类,c#,wpf,database,entity-framework,mef,C#,Wpf,Database,Entity Framework,Mef,我是实体框架的新手,我想知道我想做的事情是否可行 我有一个名为“Monitor”的类,其中包含“MonitorField”的列表 每个“MonitorField”都有一个名为“AMonitoringTool”的抽象类列表** AMonitoringTool允许其他开发人员通过继承外部DLL中的AMonitoringTool来创建自己类型的字段 主要问题是应用程序不知道“MonitorField”中的实际类型,因此无法将我的对象保存到数据库中 我有一个带有数据库集的监视器实体,但我无法保存监视器列
public class MonitorEntity : DbContext
{
public DbSet<Monitor> Monitors { get; set; }
public MonitorEntity()
{
}
}
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;
}
}
}
public class MonitorField
{
public AMonitoringTool Configuration { get; set; }
public MonitorField()
{
FieldName = "<label>";
}
}
公共类监视实体:DbContext
{
公共数据库集监视器{get;set;}
公众监察实体(第
{
}
}
Monitor.cs
public class MonitorEntity : DbContext
{
public DbSet<Monitor> Monitors { get; set; }
public MonitorEntity()
{
}
}
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;
}
}
}
public class MonitorField
{
public AMonitoringTool Configuration { get; set; }
public MonitorField()
{
FieldName = "<label>";
}
}
公共类监视器
{
公共监视器(字符串名称)
{
监视器名称=名称;
FieldList=新列表();
}
私有列表m_fieldList=null;
公共虚拟列表字段列表
{
得到
{
返回m_字段列表;
}
设置
{
m_fieldList=值;
}
}
}
MonitorField.cs
public class MonitorEntity : DbContext
{
public DbSet<Monitor> Monitors { get; set; }
public MonitorEntity()
{
}
}
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;
}
}
}
public class MonitorField
{
public AMonitoringTool Configuration { get; set; }
public MonitorField()
{
FieldName = "<label>";
}
}
公共类监视器字段
{
public-AMonitoringTool配置{get;set;}
公共监视器字段()
{
FieldName=“”;
}
}
您似乎希望此库的使用者拥有自己的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; }
}
并创建自己的上下文:
var myContext = new MonitorEntity<MyMonitoringTool>();
var myContext=newmonitorenty();
如果您需要一个具体的类型来保存到数据库中,您可以让上下文接受一个泛型类型参数。您可能会更幸运地将类似这样的动态内容保存到文档数据库中。您还可以将MonitorField项序列化为strings.Thx以获取答案!我还有一个疑问,您的解决方案只有在单个监视器中的每个MonitorField都包含从AMonitoringTool继承的相同类型时才起作用?另一个使用者可以使用自己的Monitor field实现创建单独的数据库,但每个数据库在创建后都会锁定到该数据库。