我是实体框架的新手,我想知道,我想做什么,是否可能。
我有一个名为“monitor”的类,其中包含“monitorfield”的列表。
每个“monitorfield”都有一个名为“amonitoringtool”的抽象类列表**
提供amonitoringtool是为了允许另一个开发人员通过从外部dll中的amonitoringtool继承来创建自己类型的字段。
主要问题是应用程序不知道“monitorfield”中的实际类型,无法将我的对象保存到数据库中。
我有一个带dbset的监视器实体,但无法保存监视器列表,我收到以下错误消息:
“抽象类型'{…}.amonitoringtool'没有映射的子代,因此无法映射…”
我的第一个想法是在继承自“amonitoringtool”的每个dll中实现映射,但我不知道如何实现。
监控实体.cs

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

    public MonitorEntity()
    {

    }
}

监视器.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;
            }
        }
    }

监控字段.cs
public class MonitorField
{
    public AMonitoringTool Configuration { get; set; }

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

最佳答案

您似乎希望这个库的使用者有自己的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>();

10-01 05:08