我需要直接访问此表。是的,我知道在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
,只有Foo
,Bar
和我想要定义的联结表Foo_Bar
。它可能是自动的东西,但我看不出是什么导致它。我的modelBuilder
电话肯定会将其映射到下划线名称。
答案 0 :(得分:0)
好的,我还不知道如何在Gert建议的模型中解决它(没有收到错误消息)但是辅助上下文解决了它:
public class JunctionModel : DbContext {
public virtual DbSet<Foo_Bar> Foo_Bar { get; set; }
public JunctionModel()
: base("name=DatabaseConnection") {
}
}
This我自己的实验似乎表明,在没有彻底改变模型的情况下,没有其他更直接的方法,在某些情况下可能不容易实现。