我想要一些有关如何在多个DbContext
之间共享实体的指南-或找到可以解决同一目标的替代解决方案。
我们正在使用EF Core开发DDD系统,该系统由多个逻辑模块(Core,Foo,Bar,...)组成,每个逻辑模块都有自己的DbContext
/ Schema并命名为ConnectionString
相同的数据库(但在许多情况下,除非下文所述,否则不需要所有模块共享相同的数据库)。
一个关键目标是能够拥有第三方开发的模块(可以想像DotNetNuke吗?),这些模块可以管理自己的模式而不会干扰其他供应商-同时保持EF提供的抽象性。
核心模块用于管理系统域问题(Diagnostics
,Errors
,Tenancy
,Sessions
,SessionOperations
, Users
,Permissions
,UserSecurityProfiles
,Roles
,Media
等)
其他模块用于特定于 business 领域的特定问题(例如:一个可能用于Student
,School
,Courses
等)服务和实体)。
在几乎所有情况下,逻辑域之间都没有交叉,因此每个模块都是非常独立的关注点,并且在这方面要整洁...限制用户和组的面积(据我们所知)。
组是递归的,可以将用户分配给具有各种角色(Owner
,Admin
,ContactPerson
,Member
)的组。 User
可以是Enabled/Disabled
,并具有Name元素(Display
,Given
,Surname
等)和Email
。
这是一个普遍关注的问题,适用于许多领域,适用于核心模块。
但是其他逻辑模块及其各自的DbContext
可能具有与公共User
相关的实体。
例如,在SI
(学生信息)模块中,所有Student
都是User
,因此可能继承自User
(或具有可导航的属性)。另一方面,例如,在CRM
模块中,并非所有Customer
都是User
,因此需要将User
的可为空的Navigation属性
(我只是在这里发明用例)。
关系可能是
我们尝试过的事情包括:
我们尝试在StudentModelDescription
内创建一个SIDbContext
,它继承自Core模块UserModelDescription
内的CoreDbContext
,并将模型定义的Schema调整为“ Core ”,而不是“ SI”,但是可以预见的是,它只会使创建表加倍,并失败。
我们没有尝试在CoreDbContext
学生对象上添加SIDbContext
用户参数,因为即使SIDbContext
编译后,它也不知道检索核心User
(将会超出其模型定义)。
我们考虑过将SIDbContext
继承自CoreDbContext
,然后忽略Core表的创建,并关闭Migrations / model的创建(因此,它不会尝试重新创建表格)。
这是EF6
中的推荐课程,但可能会否定每个供应商无需在同一DbContext
...中协调就可以添加/拉出其模块的能力...
从根本上讲,我们没有关于如何进一步推进该核心(无双关语)概念的想法,想知道EF Core是否带来了解决此类问题的新功能。
感谢您的见解和时间。