C# - Dll-Plugin and Entity-Framework

本文关键字:Entity-Framework and Dll-Plugin | 更新日期: 2023-09-27 18:05:46

我正在使用PluginManager搜索dll文件并将它们(和她的函数)添加到我当前的应用程序。

我还使用实体框架从对象创建数据库和表,但我必须在DatabaseContext类中声明数据库的对象。

我如何保存一些对象从一个插件在这个数据库?

我试过了:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        foreach( PluginDto plugin in BackendContext.Current.PluginManager._plugins) {
            foreach(Type obj in plugin.plugin.getPluginDatabaseObjects())
            {
                Type typ = typeof(EntityTypeConfiguration<>).MakeGenericType(obj);
                List<MethodInfo> l = modelBuilder.GetType().GetMethods().ToList<MethodInfo>();
                MethodInfo m_Entitiy = modelBuilder.GetType().GetMethod("Entity").MakeGenericMethod(new Type[] { obj });
                var configObj = m_Entitiy.Invoke(modelBuilder, null);
                MethodInfo m_ToTable = configObj.GetType().GetMethod("ToTable", new Type[] { typeof(String) });
                m_ToTable.Invoke(configObj, new object [] { obj.Name });
            }
        }
    }

但是得到这个异常:

类型为"System"的未处理异常。InvalidOperationException'在EntityFramework.dll中发生

附加信息:自从创建数据库以来,支持'DatabaseContext'上下文的模型已经更改。考虑使用代码优先迁移来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

C# - Dll-Plugin and Entity-Framework

EF可以使用下面的示例来支持添加动态dbset。

这个想法是,而不是在你的Db上下文中手动创建你的dbset,你重载OnModelCreating方法,它允许动态构建类型。

请记住,这个示例使用一个自定义属性PersistentAttribute,用于注释类,以便该代码找出哪些类适合模型生成。