代码优先的不同模式中的两个表之间的关系映射

Realtion mapping between two tables in different schema with code first

我正在为我的 .net 核心项目使用代码优先方法。我们在单个数据库中使用多个模式。 我们在不同的 class 库项目中维护模型,例如库存、销售、财务等。
模型映射就像(注意:下面是不同的名称空间)

[Table(name: "Product", Schema = "Inventory")]
public class Product 
{
    public int ProductId {get;set;}
    public string Name {get;set;}
}


[Table(name: "Order", Schema = "Sales")]
public class Order
{
    public int OrderId{get;set;}
    public int ProductId {get;set;}
    public virtual Product Product {get;set;}
}

在架构中,我可以使用属性添加关系。现在我想添加这些表之间的关系。
我尝试了一些调整但没有用。
感谢任何帮助。

更新:
每个模式的 DBcontext 也不同,它们被放置在各自的 class 库

你打错了

public virtal Product Product {get;set;}

应该是virtual

您还需要产品中的导航成员

[Table(name: "Product", Schema = "Inventory")]
public class Product 
{
    public int ProductId {get;set;}
    public string Name {get;set;}
    public virtual ICollection<Order> Orders { get; set; }
}


[Table(name: "Order", Schema = "Sales")]
public class Order
{
    public int OrderId{get;set;}
    public int ProductId {get;set;}
    public virtual Product Product {get;set;}
}

您当前的架构中存在相互冲突的方法:

一方面,您采用了微服务方法,其中每个服务都处理自己的限界上下文(例如库存、销售等)。您使用不同的数据库模式似乎可以证实这一点,这些模式可以看作是逻辑上不同的数据库,恰好部署在单个物理数据库中。这很好,并且允许将来扩展/隔离,例如,您可以在其中将库存数据移动到它自己的数据库中。

另一方面,您正试图将数据存储视为一个整体人工制品,您可以在其中构建 table 跨越由微服务方法建立的有界上下文边界的关系。

如果您希望维护您的微服务方法(这是完全合理的),那么您必须接受这样一个事实,即您不能为跨越不同微服务中实体的 table 关系依赖数据库强制参照完整性服务。

您需要上面的层可以从单独的微服务中检索数据并将它们组合到消费者正在寻找的实体(最好是 DTO 实体,而不是用于代码优先的 EF 数据实体)中。

该层将首先从 'Sales' 服务检索订单,然后枚举您的订单并从 'Inventory' 服务检索相关产品,然后将它们映射到包含导航属性的 DTO 实体OrderDTO 和 ProductDTO。

您的订单数据实体不应具有指向“产品”的虚拟导航 属性,而应仅包含与订单相关的产品的唯一 ID(不作为数据库关系强制执行)。就个人而言,我会更进一步,为产品数据 class 引入一个 GUID 唯一标识符,可以在订单中使用它来唯一标识产品。这样,如果您确实将 Inventory table 迁移到新数据库,则不必担心在迁移期间管理数据库标识列作为 Inventory 服务的引用 'outside'产品 table 将是 GUID 唯一标识符。