2017-02-19 20 views
0

このテーブルに直接アクセスする必要があります。はい、私はこのような質問があることを知っている、そして、彼らはすべて、彼らがなぜこれを必要としないのか、まだ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コールは間違いなくそれを下線付きの名前にマップします。

+0

使用しない余分な列をテーブルに追加します。そうすれば、EFはそれを「ジャンクション・テーブル」として扱わないでしょう。しかし、最もクリーンなアプローチではありません。 –

+0

しかし、私はジャンクションテーブルとして扱う必要があります。私は通常EFでそれを使用しています。しかし、私はまた、バックアップ/復元機能が必要になることもあります。 –

+0

まあ、それはいつものように機能しますが、違いは余分な列のためにモデルに含まれているため、直接アクセスできます。外部キーだけで構成される純粋なジャンクション・テーブルは、モデルから除外されます。 –

答えて

0

OK、私はまだゲルトが示唆したように(エラーメッセージを取得せずに)モデル内でそれを解決する方法を知りませんが、二次コンテキストは、右のそれをすべて解決:

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

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

Thisと私自身の実験は思えますいくつかのケースでは容易には不可能かもしれないモデルを根本的に変えずに、他のより直接的な方法がないことを示唆している。

関連する問題