1

プロジェクトで N 層アーキテクチャを使用しています。データ アクセス層では、最初に Entity Framework コードを使用します。DAL にオブジェクトを入力し、コンテキストを破棄してオブジェクトをビジネス レイヤーに転送すると、ナビゲーション プロパティが null になります。コンテクストを処分しなくても問題ないのですが、質問はコンテクストを処分してもよろしいでしょうか?はいの場合、ナビゲーション プロパティが null にならないように、オブジェクトを次のレイヤー (ビジネス) に転送するときに問題を解決するにはどうすればよいですか。データアクセス層の私のコード:

public List<DomainObject.ContractCenter> GetAll()
{
    try
    {
        List<ContractCenter> contractCenters = new List<ContractCenter>();
        using (var context = new DBContext())
        {
            contractCenters = context.ContractCenters.ToList();
        }

        return contractCenters;
    }
}
4

2 に答える 2

2

DbContext「Unit of Work」がアクティブである限り、 は存続する必要があります。たとえば、Web アプリケーションを作成している場合は、リクエストの開始時に作成し、遅くともリクエストの終了時に破棄する必要があります。

あなたの場合、DbContextドメイン モデルの作成が完了するまで、 を有効にしておく必要があります。そうしないと、遅延ロードされているナビゲーション プロパティが になりnullます。モデルにデータを入力したときにエンティティを破棄してエンティティを「デタッチ」することの欠点はDbContext、エンティティの状態追跡が失われることです。データを保存する場合は、自分でこれを行う必要があります。

多くのドメイン ロジックがない場合は、コード ファーストの POCO エンティティに直接追加します。このようにして、状態の追跡を引き続き行うことができます。

IoC コンテナーを使用しDbContextて、リポジトリ、またはデータ アクセスに使用しているものの有効期間を管理することをお勧めします。Unit of Work パターンと組み合わせるとよいでしょう。たくさんの選択肢がありますが、私のお気に入りのいくつかは

IoC コンテナーを使用してライフタイムを管理するための優れたチュートリアルがたくさんあります。Google で検索してください。:)

于 2012-12-17T09:03:51.253 に答える
1

質問に答えるには:

コンテキストを破棄するのは良いですか?

はい、コンテキストはできるだけ短命にする必要があります(プロジェクトを再構築してよりクリーンなアーキテクチャを実装する可能性がある場合は、UnitOfWork と IOC に関する @khellang の回答を参照してください)。

オブジェクトを次のレイヤーに転送するときの問題を解決するにはどうすればよいですか

関連するコレクション (ナビゲーション プロパティ) をeager-loadする必要があります:

public List<DomainObject.ContractCenter> GetAll()
{
    try
    {
        using (var context = new DBContext())
        {
            return context.ContractCenters.
                           Include(c => c.YourChildCollection1).
                           Include(c => c.YourChildCollection2).
                           ...
                           ToList();
        }
    }
}
于 2012-12-17T10:44:18.953 に答える