尝试使用运行时插件提供的基实体和继承实体来定义DBContext实体

本文关键字:实体 继承 DBContext 定义 运行时 插件 | 更新日期: 2023-09-27 18:27:02

我的项目需要一个核心应用程序,作为小型应用程序风格的应用程序与更大的中央系统交互的中心点。这些都是电视应用程序,所以不要认为是移动应用程序。大多数应用程序将能够引用这个核心,而不需要任何额外的代码。然而,一些应用程序(目前尚不清楚)很可能需要具有额外的功能。我想用一个插件模型来支持这个额外的功能,该模型允许在不更改Core的情况下扩展Core的功能。由于插件开发人员可能无法使用源代码。我想使用EF Code First来允许插件扩展数据模型。

例如,我可能定义了一个User实体,他们可能需要扩展它以支持CustomUser:User。我想建立这样的表格:

modelBuilder.Entity<User>()
.Map(m => m.ToTable("User"))
.Map<CustomUser>(m => m.ToTable("CustomUser")); // Would like this portion provided by plug-in

我知道如果你一次完成所有操作,这是可行的,但我不知道如何从插件中提取映射。我试着把它分成两种说法,比如:

核心

modelBuilder.Entity<User>()
.Map(m => m.ToTable("User"));

插件

modelBuilder.Entity<User>()
.Map<CustomUser>(m => m.ToTable("CustomUser"));

但是,当它运行时,我会收到一个错误,指出必须在单个映射语句中定义User实体。

因此,到目前为止,我一直在试图弄清楚如何在定义用户实体之前只从插件传递映射信息,但由于Core项目不知道插件"CustomUser",因此在运行时看不到传递映射信息的方法。

如果需要进一步澄清,请询问。

编辑1:作为信息点。我在这里关注了这篇文章,可以复制它的功能,但它不允许我建立我想要的关系。除非我错过了什么。

编辑2:做额外的研究我发现我可以像在这篇文章中那样构建我的映射配置,但我不知道如何在创建后传递我的配置。我目前正在使用MEF,但我愿意尝试不同的方法。我听说Ninject可以做这种事情,但我不清楚这是怎么回事。

尝试使用运行时插件提供的基实体和继承实体来定义DBContext实体

如果我完全误解了你,请原谅,但我认为你在寻找以下内容。我们的解决方案中有这样的东西。

核心

modelBuilder.Entity<User>()
    .Map(m => m.ToTable("User"));

插件

modelBuilder.Entity<CustomUser>()
    .Map(m => m.ToTable("CustomUser"));

其中

public class CustomUser : User {}