C# 直接访问EF连接表
我需要直接进入这张桌子。是的,我知道有这样的问题,所以他们最终都显示出人们还不习惯EF导航为什么他们不需要这个。但我碰巧知道如何正常使用EF,我仍然需要它,因为我需要备份和恢复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是一个适当的帮助器类,用于存储构成关系的两个键。我可以轻松地将此列表导出为我选择的
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()
中用我的名字引用它?我不知道您是否引用了,但创建第二个上下文是它的全部内容(不要将其用于迁移)。