【问题标题】:Navigation property from another DbContext来自另一个 DbContext 的导航属性
【发布时间】:2019-10-23 22:16:31
【问题描述】:

假设有 2 个 DbContext:

DbContextA {
    DbSet<Person> Persons { get; set; }
}

DbContextB {
    DbSet<Group> Groups{ get; set; }
}

在这种情况下,实体Person 中是否可以像这样拥有Group 的导航属性:

class Person {
    public int GroupId { get; set; }
    public Group Group { get; set; }
}

我有一个请求将一个 DbContext 划分为具有单独实体的多个 DbContext,但在进入之前,我想知道导航属性是否可以在上下文之间工作,所以我不需要更改查询,因为我在查询中使用导航属性,例如persons.Where( p =&gt; p.Group.Name == "GroupName").

【问题讨论】:

  • 您不能在上下文之间添加关系。上下文表示一个独立模型,其工作是为特定的业务场景提供服务。为什么要使用 two 上下文?你想用这个来达到什么目的?为什么要“划分”上下文?是否有一个庞大的上下文试图服务于多种场景,直到变得笨拙?

标签: c# entity-framework-core


【解决方案1】:

没有。这是不可能的。 EF 非常接近 DDD(领域驱动设计)。上下文是您的工作单元,但它被称为“上下文”,因为它是实现 DDD 中“有界上下文”概念的类。换句话说,您的应用程序的每个子域都应该有一个上下文,并且上下文应该完全封装该子域。在两个上下文之间交叉表明您没有正确细分您的域。

如果这两个实体确实属于同一个子域,那么它们应该存在于同一个上下文中。如果不是,那么无论如何,一个人引用另一个人是不正确的。

【讨论】:

  • 这仍然是 2020 年和 EF Core 3.0 的“必经之路”吗?
最近更新 更多