1

エンティティと遅延読み込みで見つけられるすべての読み取りと、ここでの他の質問を行いましたが、私の人生では、これを機能させることはできません。DBのSQLは次のとおりです。

CREATE TABLE corporations(
corporationID bigint PRIMARY KEY
);

CREATE TABLE Character(
personID bigint PRIMARY KEY,
corporationID int NOT NULL,
FOREIGN KEY (corporationID) REFERENCES corporations(corporationID)
);

そして、それを取得するためのエンティティコード ( *オリジナルから編集、まだ壊れています * ):

DBEntities context = new DBEntities();
public Character Character_GetByID(long CharacterID)
        {
            context.ContextOptions.LazyLoadingEnabled = true;
            Character character = context.Characters.Where(c => c.CharacterID == CharacterID).FirstOrDefault();      
            return character;
        }

だから私の理解から、これで私は行くことができるはずです

Character char = Character_GetByID(characterID);
Corporation corp = char.Corporation;

「char.Corporation」オブジェクトが存在し、エンティティが外部キーから適切に作成しました。しかし、上記のコードを実行すると、「corp」は常に NULL として返されます (関連する企業が DB にあることは確かですが)。

私が気づいたことの 1 つは、自動生成された Entity Character オブジェクトに、次の機能があることです。

public virtual Corporation Corporation
        {
            get { return _corporation; }
            set
            {
                if (!ReferenceEquals(_corporation, value))
                {
                    var previousValue = _corporation;
                    _corporation = value;
                    FixupCorporation(previousValue);
                }
            }
        }

レイジーロードを使用すると、「get」関数は「nullの場合、データベースからCorporationを取得しようとする」のようなものになると思うので、これは奇妙に思えます。どんな考えでも大歓迎です。

* EDIT * 遅延読み込みの設定方法のリクエスト:

私の Context クラスでは、私が持っているすべてのコンストラクターに対して

this.ContextOptions.LazyLoadingEnabled = true;

上記の最初の C# 関数からわかるように、クエリを実行する直前に、関数自体で true に設定しようとしました。

4

3 に答える 3

3

遅延読み込みは、オブジェクト コンテキスト (この場合は DBEntities クラス インスタンス) によって提供される機能です。そのため、エンティティ オブジェクトが DBEntities インスタンスにアタッチされている場合にのみ機能します。Character_GetByID メソッドが完了すると、コンテキストが破棄され、エンティティが切り離され、遅延読み込みリクエストを実行できなくなります。

于 2012-05-10T20:09:50.443 に答える
1

このdbcontextを使用するとすぐに破棄されるため、usingステートメントを削除します

using (var context = new DBEntities())
{
   ...
}//context is disposed here... lazy loading is not possible
于 2012-05-10T20:13:58.737 に答える
0

.Include(x=> x.Corporation) を使用します。

関連データの読み込みに関する情報。

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-応用

于 2012-05-10T20:06:23.613 に答える