1

私はEntityFrameworkを使用してASP.NETC#に取り組んできましたが、特定の重要な点について非常に助けてくれる人もいます。

よくわからなかった点も1つあります。EFからデータを取得するときに、オブジェクトとそのサブオブジェクト(外部キー関係テーブルデータ)を使用することになっているのではないでしょうか。

これが私のデータベース設計です(これは以前に回答した質問にも表示されていました) ここに画像の説明を入力してください

私のコードでは、次のようなメンバーエンティティを取得します。

//In some aspx.cs file
var Mem = new MemberManager().GetById(2);

//In MemberManager class
public Member GetById(long id)
        {
            using(var Context = new NoxonEntities())
            {
                return Context.Member.First(c => c.Id == id);
            }
        }

私がこれをするとき:

var Mem = new MemberManager().GetById(2);
var Lang = Mem.Language;
//I get 
//Error: 'Mem.Language' threw an exception of type 'System.ObjectDisposedException'

この例外を取り除くために、私はこれを行う必要がありました:

public Member GetById(long id)
        {
            using(var Context = new NoxonEntities())
            {
                var Result = Context.Member.First(c => c.Id == id);
                //Getting the Language Entity
                Result.Language = Context.Language.First(c => c.Id == Result.LanguageId);

                return Result;
            }
        }

FULLエンティティを作成するには、SELECTを実行する必要がありますか?言語テーブルに関連する別のテーブルがある場合はどうなりますか?機能テーブルとしましょう。私はこれを行う必要があります:

public Member GetById(long id)
            {
                using(var Context = new NoxonEntities())
                {
                    var Result = Context.Member.First(c => c.Id == id);
                    //Getting the Language Entity
                    Result.Language = Context.Language.First(c => c.Id == Result.LanguageId);
                    Result.Language.Feature = Context.Language.Feature.First(c => c.Id == Result.FeatureId);
                    return Result;
                }
            }

これは非常に長くなる可能性があり、私はかなり確信しています(少なくとも私は本当に願っています)私は何かについて間違っていますが、選択後にオブジェクトとそのサブオブジェクトを使用できない場合、EFを持つ目的は何ですか?using(var Context = new NoxonEntities())ブロックのサイトでサブオブジェクトのみを使用できますか?

ありがとうございました、

4

2 に答える 2

3

コンテキストをデータベース接続と考えてください。usingステートメントでコンテキストを作成し、 using. ブロックの後のすべてはusing、データベース接続にアクセスできなくなります。ここで例外が発生します...

var Lang = Mem.Language;

...遅延読み込みはデータベースからナビゲーション プロパティを読み込もうとしますLanguageが、データベースへの接続は既に破棄されているためです。このような遅延読み込みは、データベースへの接続がまだ利用可能な場合にのみ、ブロック内で使用できます。using

次のように熱心な読み込みを使用することで、例のナビゲーション プロパティの読み込みを簡素化できますInclude

public Member GetById(long id)
{
    using(var Context = new NoxonEntities())
    {
        return Context.Member.Include("Language").First(c => c.Id == id);
    }
}

または、両方のナビゲーション プロパティに次を使用します。

return Context.Member.Include("Language.Feature").First(c => c.Id == id);

1 つのデータベース クエリでメンバー言語と機能を読み込みます。

于 2012-09-13T11:15:18.327 に答える
2

あなたの問題は遅延読み込みが原因です。何が起こっているかというと、EF が関連するエンティティを読み込んでいLanguageないということです。これは、データが必要になるかどうかわからないためです。次に、コンテキストを破棄しているため、Languageナビゲーション プロパティにアクセスしようとするとジャンプできません。

ここにはいくつかのオプションがあります。熱心な読み込みが可能です。言語エンティティである熱心な読み込みに関する素晴らしいブログ投稿は次のとおりです。

var Result = Context.Member.Include("Language").First(c => c.Id == id);

または、リクエスト全体を通してコンテキストを維持する必要があります。これは、リクエストごとにコンテキストを維持するための優れた方法に関する良い投稿です。

私はあなたが別の投稿であることを覚えています-そして、あなたはエンティティを切り離して別の場所に保存してから、再度添付していると思います。これがその機能に関連している場合は、Language オブジェクトにアクセスし、コンテキストに再アタッチした後に問題を解決することもできます。

于 2012-09-13T11:17:55.857 に答える