どのようにEF7流暢なAPIを使用して単一のPOCOの2つのテーブルを作成するには?

c# ef-code-first entity-framework entity-framework-core

質問

私は単一のエンティティタイプの2つのテーブルを作成したいと思います。 2番目のものがいくつかの外部キーを見逃すことができる点を除いて、テーブルは似ています(btw、その質問の文脈ではあまり重要ではありません)。

最初のテーブルは一般的な方法で使用されます(選択クエリ、小さな挿入クエリなど)。

2番目のテーブルは一時的なもので、一括挿入操作に使用されます(まず、SqlBulkCopyを使用して一時テーブルにデータを挿入し、次に項目を最初のテーブルにアップサンプリングするためにMERGEクエリを使用します)。このアプローチにより、何千ものレコードを非常に高速にアップアップすることができます。

だから、同じエンティティに対して2つの同一のテーブルを作成するEF7を強制する最良の方法は何ですか?

私は同様の質問を見つけました: EFコードの最初の2つの同一のテーブルに対して同じタイプを使用します。しかし、その人(質問をする人)が同じエンティティを持つ複数のDbSetsを望むようです。私のケースは少し異なります - 私はテーブルの作成を自動化したいだけです。

受け入れられた回答

さて、私は自分でその質問に答えることができるようです。

したがって、実際に私は1つの醜い解決策を持っています:単純な継承を使用して、同じDbContextで別のDbSetを作成するために使用できる同一のエンティティを作成できます。

また、EF継承戦略の関与を避けるために、ベース型をマップしないでおく必要があります(つまり、DBスキーマに継承関係の変更は必要ありません)。その要件は、(マッピングされない) 基底クラス2つの継承者 (1つはプライマリテーブルDbSet用、もう1つはテンポラリテーブルDbSet用)を作成するように強制します。

このアプローチにより、 同じタイプの問題を回避することができます。さらに重要なことは、テーブルスキーマを問題なくそのまま維持できることです。

例:

/// <summary>
/// Base entity, not used by EF at all - intended to define properties only.
/// </summary>
public class MyEntityBase
{
    public int Id { get; set; }
    public string Name { get; set; }
}

/// <summary>
/// That entity used to create primary table and used by app logic.
/// </summary>
public class MyEntity : MyEntityBase
{
}

/// <summary>
/// That entity used to create temp table only.
/// </summary>
public class MyTempEntity : MyEntityBase
{
}

/// <summary>
/// Here is our DB context with two DbSets...
/// </summary>
public class MyDbContext : DbContext
{
    /// <summary>
    /// That DbSet should be used by app logic.
    /// </summary>
    public DbSet<MyEntity> MyEntities { get; set; }

    /// <summary>
    /// That DbSet will force EF to create temp table.
    /// App logic shouldn't interact with it in common way 
    /// (only SqlBulkCopy and some hand-written queries) 
    /// so it is not public.
    /// </summary>
    protected DbSet<MyTempEntity> MyTempEntities { get; set; }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ