Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF4如何在多对多关系中公开联接表_C#_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# EF4如何在多对多关系中公开联接表

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不要以这种方式建模并始终包含联接表?或者我缺少一种更简单的方法

假设我有以下表格:

Essence、EssenceSet和Essence2AssenceSet,其中Essence2AssenceSet仅保存前两个表的ID,以形成M:M关系

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


有没有一种方法可以告诉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的方法:

  • 删除设计器创建的M:N关系
  • 添加新实体
  • 向表示外键的新实体添加两列
  • 将新实体映射到连接表
  • 向相关实体添加关联
  • 为添加的关系设置引用约束

  • 也许吧,但现实是它们是表,为了创建一个我已经有了信息的记录而从数据库中查询2个对象似乎是浪费按照您的建议添加另一个synth键实际上会在您说我应该忽略的模型中创建连接表。添加代理键是正确的,可能不应该这样做,但您需要查询数据库中的对象,这是ORM的缺点之一。每当您在代码和数据库之间添加另一层时,它有时会在系统上创建更多的工作。虽然这可能会起作用,但我会担心将来可能出现的问题,因为它可能会利用不应该依赖的行为。另外,我假设已经存在具有这些ID的实体,并且系统假设在附加对象时没有对其进行任何更改,这就是为什么这会起作用,但是当您创建一个新的哈希集并仅添加一个项然后将其持久化时,您不会丢失现有的关系吗?不,您不会丢失现有的关系。