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

时间:2011-03-14 20:27:23

标签: c# entity-framework entity-framework-4

说我有以下表格:

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

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

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

2 个答案:

答案 0 :(得分:3)

您可以在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<SecondEntity>();
   firstEntity.SecondEntities.Add(secondEntity);

   context.SaveChanges();
}

无论如何都可以将联结表暴露为实体,但是你会失去对EF的安慰,并且会像SQL一样回退到SQL:

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

答案 1 :(得分:0)

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

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