说我有以下表格:
Essence,EssenceSet和Essence2EssenceSet,其中Essence2EssenceSet仅包含前2个表的ID以形成M:M关系。
在EF中,因为Essence2EssenceSet没有其他字段,所以它不会在模型中公开。我发现当我已经拥有创建记录所需的2个ID但不一定加载了Essence和EssenceSet记录(只是他们的ID)时,很难将记录插入到此表中
有没有办法告诉EF不以这种方式建模并始终包含连接表?或者我错过了一种更简单的方法来创建这些连接表记录?
答案 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 :(得分:0)
实体框架是一个ORM,因此,当您使用它时,您不应该根据表来考虑数据库,而是根据对象来考虑数据库。您不应该将标识插入到包含M2M关系的表中,但是您应该加载关系的一侧,这应该公开另一方的集合并将其添加到该集合。对于M2M,您可能需要加载另一侧并执行相同的操作。
另外,我相信EF更喜欢所有表都有一个列PK(我可能错了),但您可能需要在M2M中添加一列并将其指定为PK。