Entity framework 如何从Enity框架的元模型中获取多对多关系的实体到表映射
是否有任何方法可以让底层的“多对多表”在实体框架中连接两个实体 例如,如果我们有Product和Order实体,我们如何获得连接Product和Order表的基础连接表Product_OrderEntity framework 如何从Enity框架的元模型中获取多对多关系的实体到表映射,entity-framework,mapping,metadata,Entity Framework,Mapping,Metadata,是否有任何方法可以让底层的“多对多表”在实体框架中连接两个实体 例如,如果我们有Product和Order实体,我们如何获得连接Product和Order表的基础连接表Product_Order 任何帮助都将不胜感激。可以将连接表作为一个实体公开,但并不常见/需要: 您将从以下内容开始: 删除产品和订单实体之间的多对多关系 在designer中创建新的ProductOrder实体(使用工具箱或关联菜单) 在新实体中定义与连接表中定义的外键相对应的两个属性-ProductId,OrderI
任何帮助都将不胜感激。可以将连接表作为一个实体公开,但并不常见/需要:
- 您将从以下内容开始:
- 删除
和产品
实体之间的多对多关系订单
- 在designer中创建新的
实体(使用工具箱或关联菜单)ProductOrder
- 在新实体中定义与连接表中定义的外键相对应的两个属性-
,ProductId
-确保这两个属性都标记为实体键(它们必须是数据库中的复合主键)并且具有与PKs相同的类型OrderId
- 打开映射详细信息并将新实体映射到连接表
- 创建两个新的一对多关联。第一个介于
和产品
之间,第二个介于产品订单
和订单
之间产品订单
- 在每个添加关系的属性窗口中设置引用约束(
如果你需要它,很有可能你做错了什么。为什么需要它?它会使与对象的交互更加复杂。默认情况下,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)。