C# EF4如何在多对多关系中公开联接表
假设我有以下表格: Essence、EssenceSet和Essence2AssenceSet,其中Essence2AssenceSet仅保存前两个表的ID,以形成M:M关系 在EF中,由于Essence2AssenceSet没有其他字段,因此它不会在模型中公开。我发现,当我已经有了创建记录所需的2个ID,但不一定加载了Essential和EssenceSet记录(只是它们的ID)时,将记录插入此表会很困难C# EF4如何在多对多关系中公开联接表,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,假设我有以下表格: Essence、EssenceSet和Essence2AssenceSet,其中Essence2AssenceSet仅保存前两个表的ID,以形成M:M关系 在EF中,由于Essence2AssenceSet没有其他字段,因此它不会在模型中公开。我发现,当我已经有了创建记录所需的2个ID,但不一定加载了Essential和EssenceSet记录(只是它们的ID)时,将记录插入此表会很困难 有没有一种方法可以告诉EF不要以这种方式建模并始终包含联接表?或者我缺少一种更简单的方法
有没有一种方法可以告诉EF不要以这种方式建模并始终包含联接表?或者我缺少一种更简单的方法来创建这些联接表记录吗?实体框架是一种ORM,因此,当您使用它时,您不应该将数据库看作是表,而是对象。您不应该将标识插入到保存M2M关系的表中,但应该加载关系的一侧,这应该公开另一侧的集合并将其添加到该集合中。对于M2M,您可能需要加载另一侧并执行相同操作
此外,我认为EF更喜欢所有表都有一个单列PK(我可能在这方面有错误),但您可能需要向M2M中添加一列并将其指定为PK。您可以在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();
}
使用(var context=new MyContext())
{
var firstEntity=newfirstentity{Id=firstId};
var secondEntity=new secondEntity{Id=secondId;}
context.firstEntity.Attach(firstEntity);
context.secondEntity.Attach(secondEntity);
firstEntity.SecondEntities=new HashSet();
firstEntity.secondEntity.Add(secondEntity);
SaveChanges();
}
无论如何,将连接表作为实体公开是可能的,但您将失去EF的舒适性,并退回到类似SQL的方法:
也许吧,但现实是它们是表,为了创建一个我已经有了信息的记录而从数据库中查询2个对象似乎是浪费按照您的建议添加另一个synth键实际上会在您说我应该忽略的模型中创建连接表。添加代理键是正确的,可能不应该这样做,但您需要查询数据库中的对象,这是ORM的缺点之一。每当您在代码和数据库之间添加另一层时,它有时会在系统上创建更多的工作。虽然这可能会起作用,但我会担心将来可能出现的问题,因为它可能会利用不应该依赖的行为。另外,我假设已经存在具有这些ID的实体,并且系统假设在附加对象时没有对其进行任何更改,这就是为什么这会起作用,但是当您创建一个新的哈希集并仅添加一个项然后将其持久化时,您不会丢失现有的关系吗?不,您不会丢失现有的关系。