如何跨DbContext / Schema共享EF模块(或实现相同的结果)

时间:2019-06-04 03:16:16

标签: entity-framework asp.net-core

我想要一些有关如何在多个DbContext之间共享实体的指南-或找到可以解决同一目标的替代解决方案。

我们正在使用EF Core开发DDD系统,该系统由多个逻辑模块(Core,Foo,Bar,...)组成,每个逻辑模块都有自己的DbContext / Schema并命名为ConnectionString相同的数据库(但在许多情况下,除非下文所述,否则不需要所有模块共享相同的数据库)。

一个关键目标是能够拥有第三方开发的模块(可以想像DotNetNuke吗?),这些模块可以管理自己的模式而不会干扰其他供应商-同时保持EF提供的抽象性。

核心模块用于管理系统域问题(DiagnosticsErrorsTenancySessionsSessionOperationsUsersPermissionsUserSecurityProfilesRolesMedia等)

其他模块用于特定于 business 领域的特定问题(例如:一个可能用于StudentSchoolCourses等)服务和实体)。

在几乎所有情况下,逻辑域之间都没有交叉,因此每个模块都是非常独立的关注点,并且在这方面要整洁...限制用户和组的面积(据我们所知)。

组是递归的,可以将用户分配给具有各种角色(OwnerAdminContactPersonMember)的组。 User可以是Enabled/Disabled,并具有Name元素(DisplayGivenSurname等)和Email

这是一个普遍关注的问题,适用于许多领域,适用于核心模块。

但是其他逻辑模块及其各自的DbContext可能具有与公共User相关的实体。

例如,在SI(学生信息)模块中,所有Student都是User,因此可能继承自User(或具有可导航的属性)。另一方面,例如,在CRM模块中,并非所有Customer都是User,因此需要将User的可为空的Navigation属性 (我只是在这里发明用例)。

关系可能是

  • 脆弱(例如,仅是Student对象上包含用户ID的字段,方法可以用来获取相关的用户)。
  • 可导航:例如,学生对核心用户将具有可导航属性。优点是可以开发使用用户属性的linq查询。例如,可以选择所有已启用用户的学生。或根据他们的登录电子邮件地址查找学生。

我们尝试过的事情包括:

我们尝试在StudentModelDescription内创建一个SIDbContext,它继承自Core模块UserModelDescription内的CoreDbContext,并将模型定义的Schema调整为“ Core ”,而不是“ SI”,但是可以预见的是,它只会使创建表加倍,并失败。

我们没有尝试在CoreDbContext学生对象上添加SIDbContext用户参数,因为即使SIDbContext编译后,它也不知道检索核心User(将会超出其模型定义)。

我们考虑过将SIDbContext继承自CoreDbContext,然后忽略Core表的创建,并关闭Migrations / model的创建(因此,它不会尝试重新创建表格)。 这是EF6中的推荐课程,但可能会否定每个供应商无需在同一DbContext ...中协调就可以添加/拉出其模块的能力...

从根本上讲,我们没有关于如何进一步推进该核心(无双关语)概念的想法,想知道EF Core是否带来了解决此类问题的新功能。

感谢您的见解和时间。

0 个答案:

没有答案