EF4如何以多对多关系公开连接表

说我有以下表格:

Essence,EssenceSet和Essence2EssenceSet,其中Essence2EssenceSet仅包含前2个表的ID以形成M:M关系。

在EF中,因为Essence2EssenceSet没有其他字段,所以它不会在模型中公开。 我发现当我已经拥有创建记录所需的2个ID但不一定加载了Essence和EssenceSet记录时(仅仅是它们的ID),这使得很难将记录插入到该表中

有没有办法告诉EF不以这种方式建模并始终包含连接表? 或者我错过了更简单的方法来创建这些连接表记录?

您可以在EF中创建M:N关系而不检索对象:

using (var context = new MyContext()) { var firstEntity = new FirstEntity { Id = firstId }; var secondEntity = new SecondEntity { Id = secondId; } context.FirstEntities.Attach(firstEntity); context.SecondEntities.Attach(secondEntity); firstEntity.SecondEntities = new HashSet(); firstEntity.SecondEntities.Add(secondEntity); context.SaveChanges(); } 

无论如何,将联结表暴露为实体是可能的,但是你将失去对EF的安慰并回退到SQL方法:

  1. 删除设计者创建的M:N关系
  2. 添加新实体
  3. 将两列添加到表示外键的新实体
  4. 将新实体映射到联结表
  5. 添加与相关实体的关联
  6. 为添加的关系设置参照约束

entity framework是一个ORM,因此,当您使用它时,您不应该根据表来考虑数据库,而是考虑对象。 您不应该将标识插入到包含M2M关系的表中,但是您应该加载关系的一侧,这应该公开另一方的集合并将其添加到该集合。 对于M2M,您可能需要加载另一侧并执行相同操作。

此外,我相信EF更喜欢所有表都有一个列PK(我可能错了),但您可能需要向M2M添加一列并将其指定为PK。