直接访问EF联结表

时间:2017-02-19 18:56:06

标签: c# entity-framework-6

我需要直接访问此表。是的,我知道在SO上有这样的问题,他们最终都会向那些不习惯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; }
}

将多对多关系指定为:

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");
  });

这会导致以下错误消息: EntitySet'FooBar',模式为'dbo',表'Foo_Bar'已经定义。每个EntitySet必须引用一个唯一的模式和表。实际上,它不是,至少不是故意的。我在模型中没有FooBar,只有FooBar和我想要定义的联结表Foo_Bar。它可能是自动的东西,但我看不出是什么导致它。我的modelBuilder电话肯定会将其映射到下划线名称。

1 个答案:

答案 0 :(得分:0)

好的,我还不知道如何在Gert建议的模型中解决它(没有收到错误消息)但是辅助上下文解决了它:

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

  public JunctionModel()
    : base("name=DatabaseConnection") {
  }
}

This我自己的实验似乎表明,在没有彻底改变模型的情况下,没有其他更直接的方法,在某些情况下可能不容易实现。