1

私はMVCを学んでおり、単一のモデルクラスを作成し、次に単一のコンテキストクラスを作成し、モデルとコンテキストの組み合わせに基づいてコントローラーとビューを作成し、コードを使用してモデルをデータベースにコミットする方法を理解しています-最初。

次に、2番目のモデル(したがってテーブル)をミックスに入れたいと思います。最初に2番目のコンテキストクラスを作成し、次に2番目のモデルクラスを作成し、次にコントローラーとビューを同じ方法で作成しようとしました。この結果、一度に1つのモデルしかデータベースにコミットできないことがわかりました。一方のモデルで自動移行を有効にUpdate-Databaseしてからパッケージマネージャーでコマンドを実行すると、もう一方のテーブルがデータベースから消え、もう一方のモデルの追加/削除/編集/表示機能が機能しなくなりました。

確かに、この手法を使用して複数のテーブルを管理できる必要がありますか?私の質問は、次のような2つのモデルクラスがある場合です。

[Table("TableOne")]
public class ModelOne
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public string Foo { get; set; }
}

[Table("TableTwo")]
public class ModelTwo
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public string Bar { get; set; }
}

両方を操作する場合、Contextクラスはどのように見える必要がありますか?私のアイデアはこれを試すことでした:

public class FooBar : DbContext
{
    public FooBar()
        : base("DefaultConnection")
    {

    }

    public DbSet<ModelOne> TableOne { get; set; }
    public DbSet<ModelTwo> TableTwo { get; set; }
}

次に、コントローラーの追加ウィザードで、[テンプレート]ドロップダウンリストから[ Entity Framework] 、[モデルクラス]ドロップダウンリストから[ ModelOne ] 、[データコンテキストクラス]ドロップダウンから[ FooBar]を使用して、読み取り/書き込みアクションとビューを備えたMVCコントローラーを選択できます。最初のモデルのダウンリスト、および2番目のモデルのModelクラスドロップダウンリストのModelTwoでのみ同じオプションがあり、すべてが期待どおりに機能しますが、モデル1に基づいて最初のコントローラーを作成しようとすると、次のようになります。エラー:

FooBarの生成中にエラーが発生しました。プロジェクトを再構築してみてください。

プロジェクトを再構築しようとしましたが、同じエラーが発生するので、明らかに私はもっと大きな間違いをしています。何が間違っているのでしょうか。また、FooBarコンテキストクラスが間違っていると仮定して、FooBarコンテキストクラスを修正して機能させるにはどうすればよいですか?

4

1 に答える 1

2

通常、コンテキストクラスとモデルクラスの間に1対1はありません。関連するすべてのモデルはすべて1つのコンテキストに入ります。たとえば、通常、アプリのエリアごとに1つのコンテキストがありますが、エリアを使用していない場合でも、モデルを1つのコンテキストで論理的にグループ化できます。

問題が発生するのは、複数のコンテキストを持つことです。EFは1つのコンテキストのみを移行するのが好きです。移行せずに、コンテキストクラスで手動で指定することにより、すべてのコンテキストクラスが同じDBを使用するように非常に簡単に取得できます。

public class MyContext: DbContext
{
    public MyContext()
        : base("name=MyConnectionName")
    {
    }
}

各コンテキストがそのように定義されている場合、それらはすべて、名前付き接続文字列が指す同じDBを使用します。

移行をうまく進める限り、 Programming Entity Framework:DbContext(およびそこにあるほとんどすべての関連するEFブック)の作成者であるJulie Lermanは、一般的な基本クラスを利用するソリューションを持っています(編集:実際にはJulieはパターンをEFチームのArthurVickers):

public class BaseContext<TContext> : DbContext
where TContext : DbContext
{
    static BaseContext()
    {
        Database.SetInitializer<TContext>(null);
    }
    protected BaseContext()
        : base("name=breakaway")
    {
    }
}

そして、個々のコンテキストは以下から継承しBaseContextます。

public class TripPlanningContext : BaseContext<TripPlanningContext>
public class SalesContext : BaseContext<SalesContext>

関連するセクションは、前述の本の231ページから始まります。

アップデート

実は私はあなたに嘘をついた。ジュリーが与えるパターンは、単にそれらすべてが同じDBを共有することを容易にすることです。1つのコンテキストの問題のみの移行を乗り越えるには、データベースの初期化/移行にのみ使用するすべてのものを含む1つの大きなコンテキストをごまかして作成する必要があります。コード内の他のすべてについては、他のより具体的なコンテキストを使用します。

于 2012-11-13T22:34:12.297 に答える