このテーブルに直接アクセスする必要があります。はい、私はこのような質問があることを知っている、そして、彼らはすべて、彼らがなぜこれを必要としないのか、まだEFナビゲーションに慣れていない人々を示すことになります。しかし、私はEFを通常どおりに使用する方法を知っているので、EF駆動のデータベースを外部フォーマットとの間でバックアップおよび復元する必要があるため、これが必要です。EF接合テーブルへの直接アクセス
私はこのようなジャンクションテーブル内のすべてのエントリを取得することができます:
FooBar
の関係を構成する2つのキーを格納し、適切なヘルパークラスがある
from foo in Foo
from bar in foo.Bar
select new FooBar(foo.id, bar.id);
。このリストを私の選択したフォーマットに簡単にエクスポートできます。しかし、リストア中は、空のFoo_Bar
ジャンクションテーブルにバックアップからのオリジナルのエントリを挿入する必要があります(リストア操作中にトラッキングと外部キーの制約が無効になり、入力データは良好であることがわかっています。ここで重要です)。復元操作の最中にデータベースが一貫した状態にないため、すべてのエンティティを作成して添付する従来の方法を使用することはできません。
私はどこかで見つけた1つのアイデアだが、残念なことに、それを行う方法の詳細がなくても、ジャンクションテーブルのみで構成された2次コンテキストを作成して直接投入することでした。それは私の問題に対する非常に効率的で素晴らしい解決策になるでしょうが、どうすればいいのですか?
アップデート:
として多対多の関係指定:
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");
});
これを提案することで
、私がモデルにこれを追加しようとしましたスキーマ 'dbo'およびテーブル 'Foo_Bar'を含むEntitySet 'FooBar'がすでに定義されています。各EntitySetは一意のスキーマとテーブルを参照する必要があります。実際、少なくとも意図的にではありませんでした。モデルにはFooBar
がありません。ちょうどFoo
,Bar
と接合テーブルFoo_Bar
を今定義したいと思います。それはおそらく自動的なものですが、何が原因か分かりません。私のmodelBuilder
コールは間違いなくそれを下線付きの名前にマップします。
使用しない余分な列をテーブルに追加します。そうすれば、EFはそれを「ジャンクション・テーブル」として扱わないでしょう。しかし、最もクリーンなアプローチではありません。 –
しかし、私はジャンクションテーブルとして扱う必要があります。私は通常EFでそれを使用しています。しかし、私はまた、バックアップ/復元機能が必要になることもあります。 –
まあ、それはいつものように機能しますが、違いは余分な列のためにモデルに含まれているため、直接アクセスできます。外部キーだけで構成される純粋なジャンクション・テーブルは、モデルから除外されます。 –