实体框架和抽象类

本文关键字:抽象类 框架 实体 | 更新日期: 2023-09-27 17:54:29

我是新的实体框架,想知道如果,我想做什么,是可能的。

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

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

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

主要问题是,应用程序不知道真正的类型在'MonitorField',阻止我的对象保存在数据库中。

我有一个MonitorEntityDbSet,但我不能保存我的监视器列表,我得到这个错误消息:

"抽象类型'{…}。"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>";
    }
}

实体框架和抽象类

您似乎希望这个库的消费者对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>();