C# 直接访问EF连接表

C# 直接访问EF连接表,c#,entity-framework-6,C#,Entity Framework 6,我需要直接进入这张桌子。是的,我知道有这样的问题,所以他们最终都显示出人们还不习惯EF导航为什么他们不需要这个。但我碰巧知道如何正常使用EF,我仍然需要它,因为我需要备份和恢复EF驱动的数据库,并将其转换为外部格式 我可以获得连接表中的所有条目,如下所示: from foo in Foo from bar in foo.Bar select new FooBar(foo.id, bar.id); 其中FooBar是一个适当的帮助器类,用于存储构成关系的两个键。我可以轻松地将此列表导出为我选择的

我需要直接进入这张桌子。是的,我知道有这样的问题,所以他们最终都显示出人们还不习惯EF导航为什么他们不需要这个。但我碰巧知道如何正常使用EF,我仍然需要它,因为我需要备份和恢复EF驱动的数据库,并将其转换为外部格式

我可以获得连接表中的所有条目,如下所示:

from foo in Foo
from bar in foo.Bar
select new FooBar(foo.id, bar.id);
其中
FooBar
是一个适当的帮助器类,用于存储构成关系的两个键。我可以轻松地将此列表导出为我选择的格式。但是,在还原过程中,我需要用这些来自备份的原始条目填充一个清空的
Foo_Bar
连接表(在还原操作期间禁用跟踪和外键约束,已知传入数据良好,此处输入验证不重要)。由于数据库在恢复操作过程中未处于一致状态,因此无法使用创建和附加所有实体的传统方法

我在某处发现了一个想法,但不幸的是,没有任何关于如何做的细节,就是创建一个只包含连接表的辅助上下文,并直接填充它。这将是一个非常有效和很好的解决我的问题,但如何才能做到呢

更新:

根据建议,我尝试将以下内容添加到模型中:

public virtual DbSet<Foo_Bar> Foo_Bar { get; set; }

[Table("Foo_Bar")]
public class Foo_Bar {
  [Key, Column(Order = 1)]
  public long foo_id { get; set; }

  [Key, Column(Order = 2)]
  public long bar_id { get; set; }
}
公共虚拟数据库集Foo_Bar{get;set;} [表格(“Foo_Bar”)] 公营富吧{ [键,列(顺序=1)] 公共长foo_id{get;set;} [键,列(顺序=2)] 公共长条形图id{get;set;} } 将多对多关系指定为:

modelBuilder.Entity<Bar>()
  .HasMany(x => x.Foo)
  .WithMany(x => x.Bar)
  .Map(config => {
    config.MapLeftKey("foo_id");
    config.MapRightKey("bar_id");
    config.ToTable("Foo_Bar");
  });
modelBuilder.Entity()
.HasMany(x=>x.Foo)
.带多个(x=>x.Bar)
.Map(配置=>{
配置MapLeftKey(“foo_id”);
config.MapRightKey(“bar_id”);
配置ToTable(“Foo_Bar”);
});

这将导致错误消息:已定义具有架构“dbo”和表“Foo_Bar”的EntitySet“FooBar”。每个EntitySet必须引用唯一的架构和表。事实上,这不是,至少不是故意的。我在模型中没有
FooBar
,只有
Foo
Bar
和我现在要定义的连接表
FooBar
。这可能是自动的,但我看不出是什么原因造成的。我的
modelBuilder
调用肯定会将它映射到带下划线的名称。

好的,我还不知道如何按照Gert的建议在模型中解决它(不会收到错误消息),但是第二个上下文解决了它:

public class JunctionModel : DbContext {
  public virtual DbSet<Foo_Bar> Foo_Bar { get; set; }

  public JunctionModel()
    : base("name=DatabaseConnection") {
  }
}
公共类连接模型:DbContext{
公共虚拟数据库集Foo_Bar{get;set;}
公共连接模型()
:base(“名称=数据库连接”){
}
}

我自己的实验似乎表明,没有其他更直接的方法可以从根本上改变模型,这在某些情况下是不可能的。

在表中添加一个你不会使用的额外列。这样EF就不会将其视为“连接表”。虽然不是最干净的方法,但我需要将其视为连接表。我使用它通常与EF,我非常高兴它处理它为我。但我也碰巧需要备份/恢复功能。好吧,它仍然会像往常一样工作,唯一的区别是,由于模型中包含了额外的列,所以您可以直接访问它。只包含外键的纯连接表将被排除在模型之外。它是由EF在
上创建的。HasMany(…).WithMany(…).Map(config=>config.ToTable(“Foo_Bar”)
为我创建的。如何修改它?是否允许我以通常的方式创建自己的表,然后在此
Map()
中用我的名字引用它?我不知道您是否引用了,但创建第二个上下文是它的全部内容(不要将其用于迁移)。