Entity framework 如何从Enity框架的元模型中获取多对多关系的实体到表映射

Entity framework 如何从Enity框架的元模型中获取多对多关系的实体到表映射,entity-framework,mapping,metadata,Entity Framework,Mapping,Metadata,是否有任何方法可以让底层的“多对多表”在实体框架中连接两个实体 例如,如果我们有Product和Order实体,我们如何获得连接Product和Order表的基础连接表Product_Order 任何帮助都将不胜感激。可以将连接表作为一个实体公开,但并不常见/需要: 您将从以下内容开始: 删除产品和订单实体之间的多对多关系 在designer中创建新的ProductOrder实体(使用工具箱或关联菜单) 在新实体中定义与连接表中定义的外键相对应的两个属性-ProductId,OrderI

是否有任何方法可以让底层的“多对多表”在实体框架中连接两个实体

例如,如果我们有Product和Order实体,我们如何获得连接Product和Order表的基础连接表Product_Order


任何帮助都将不胜感激。

可以将连接表作为一个实体公开,但并不常见/需要:

  • 您将从以下内容开始:

  • 删除
    产品
    订单
    实体之间的多对多关系
  • 在designer中创建新的
    ProductOrder
    实体(使用工具箱或关联菜单)
  • 在新实体中定义与连接表中定义的外键相对应的两个属性-
    ProductId
    OrderId
    -确保这两个属性都标记为实体键(它们必须是数据库中的复合主键)并且具有与PKs相同的类型
  • 打开映射详细信息并将新实体映射到连接表

  • 创建两个新的一对多关联。第一个介于
    产品
    产品订单
    之间,第二个介于
    订单
    产品订单
    之间
  • 在每个添加关系的属性窗口中设置引用约束(


如果你需要它,很有可能你做错了什么。

为什么需要它?它会使与对象的交互更加复杂。默认情况下,EF通过纠正多对多关系隐藏这些纯连接表。@Ladislav:谢谢你的快速回复。实际上,我必须在多对多表上做一些业务逻辑e、 我通过覆盖ObjectContext的:public int SaveChanges(SaveOptions选项)方法来实现这一点。有什么方法可以像使用ToTraceString()获取实体的表名一样获取这个表名吗方法。请看:纯连接表不是业务实体,而只是在SQL中表示
多对多关系的一种方式(这就是EF隐藏它的原因)。因此,
在此表上执行业务逻辑是没有意义的。
也许您可以更详细地描述您的场景,并且可能有更好的解决方案来解决您的问题。@Yakimych-谢谢。我想要产品实体中订单实体的ID(列表)列表,而不是订单列表(列表)。并且要求在产品实体中没有列表。因此,当产品实体加载时,列表也应填写。在保存产品实体时,包含相应订单ID的列表也应更新。希望这可以清除我想要做的要求。回答很好。作为旁注:快速但更脏的解决方案解决方法是在连接表中添加一些“虚拟”列(例如,
Id
作为标识)。在这种情况下,它将作为一个实体被EF公开。@Ladislav,不知道为什么你会说,“如果你需要它,很有可能你做错了什么。”因为在需要向关系添加属性时,这是非常常见的情况。例如,您可以在房屋和人之间创建多对多关系,但您需要这样做来添加购买日期或属于关系的任何其他内容,而不是主实体。@spadelives:我同意您的意见,但是一旦在连接表中有了其他属性,它将成为“新实体”VS将自动生成它-您不需要手动执行。注释是针对您使用纯连接表的基本情况而编写的。我想这样做,以便可以连接到linq sql中的多个表。如果没有此功能,是否需要通过导航属性筛选ProductId从顺序中选择。避免Nav属性筛选器并使用常规联接生成更干净、更好的SQL(不使用exists)。