C# 实体框架与抽象类

C# 实体框架与抽象类,c#,wpf,database,entity-framework,mef,C#,Wpf,Database,Entity Framework,Mef,我是实体框架的新手,我想知道我想做的事情是否可行 我有一个名为“Monitor”的类,其中包含“MonitorField”的列表 每个“MonitorField”都有一个名为“AMonitoringTool”的抽象类列表** AMonitoringTool允许其他开发人员通过继承外部DLL中的AMonitoringTool来创建自己类型的字段 主要问题是应用程序不知道“MonitorField”中的实际类型,因此无法将我的对象保存到数据库中 我有一个带有数据库集的监视器实体,但我无法保存监视器列

我是实体框架的新手,我想知道我想做的事情是否可行

我有一个名为“Monitor”的类,其中包含“MonitorField”的列表

每个“MonitorField”都有一个名为“AMonitoringTool”的抽象类列表**

AMonitoringTool允许其他开发人员通过继承外部DLL中的AMonitoringTool来创建自己类型的字段

主要问题是应用程序不知道“MonitorField”中的实际类型,因此无法将我的对象保存到数据库中

我有一个带有数据库集的监视器实体,但我无法保存监视器列表,我收到以下错误消息:

“抽象类型“{…}.AMonitoringTool”没有映射的子体,因此无法映射…”

我的第一个想法是在继承自“AMonitoringTool”的每个DLL中实现映射,但我不知道如何实现

监控实体.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>";
    }
}
公共类监视实体: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实现创建单独的数据库,但每个数据库在创建后都会锁定到该数据库。