2

Entity Framework のチュートリアルをいくつか見ていると、2 つのエンティティ間の関係を作成する方法がたくさんあることがわかります。しかし、これらの行の正確な意味を理解するのは難しいです.

public virtual Person person { set; get; }

public virtual IEnumerable<Person> person { set; get; }

public virtual ICollection<Person> person { set; get; }

ビデオの 1 つで、仮想のプロパティを作成するICollectionと同時に遅延読み込みが可能になると説明しています。

この場合、virtual キーワードは何をしますか? virtual キーワードなしでこれを試すとどうなるでしょうか?

4

2 に答える 2

3

プロキシは実行時に継承されたクラスとして作成されるため、EF はクラスを仮想として実装する必要があります。遅延読み込みエンジンが行うことは、バックステージでこれらのプロパティを再実装 (オーバーライド) して、期待どおりに機能させることです。virtualキーワードはまさにそれを行います: 他のクラスがその実装をオーバーライドできるようにします。これが基本的に、Lazy Load を有効にして機能させたい場合に、これらのプロパティ virtual が必要な理由です。

遅延読み込みが有効になっている場合、実行時に取得するインスタンスの名前が「Person_Proxy987321654697987465449」のように奇妙であることに気付くでしょう。

リレーションシップに関しては、たとえばデータベースに 1:N のリレーションシップを持つエンティティを作成するたびに、EF がそのリレーションシップを自動的にリストするコレクションを作成できるため、この例のようにコードで使用できます。 :N オーダー":

var ordersFromSomePerson = person.Orders;

于 2013-07-10T16:05:39.663 に答える
0

仮想 ICollectionが EF で遅延読み込みを有効にする理由に関する質問に答えるには、C#でのvirtualキーワードの定義と意味が必要です。MSDNから:

The virtual keyword is used to modify a method, property, indexer or event declaration, 
and allow it to be overridden in a derived class. For example, this method can be 
overridden by any class that inherits it.

これは、オブジェクト指向プログラミングの概念からの継承メカニズムの一部です。

サブクラスが基本クラスとして別の (拡張された) 機能を必要とすることはよくあります。そのような場合、virtualキーワードを使用すると、プログラマはオーバーライドできます(必要に応じて、この現在の実装の基本クラスのデフォルトの実装ですが、他のすべての事前定義されたメソッド/プロパティ/その他は引き続き基本クラスから取得されます!

簡単な例は次のとおりです。

// base digit class
public class Digit
{
    public int N { get; set; }
    // default output
    public virtual string Print()
    {
        return string.Format("I am base digit: {0}", this.N);
    }
}

public class One : Digit
{
    public One()
    {
        this.N = 1;
    }
    // i want my own output
    public override string Print()
    {
        return string.Format("{0}", this.N);
    }
}

public class Two : Digit
{
    public Two()
    {
        this.N = 2;
    }
    // i will use the default output!
}

2 つのオブジェクトが作成され、Printが呼び出された場合:

var one = new One();
var two = new Two();
System.Console.WriteLine(one.Print());
System.Console.WriteLine(two.Print());

出力は次のとおりです。

1
I am base digit: 2

EF での遅延評価は、virtualキーワード direct からではなく、キーワードが有効にするオーバーライドの可能性から発生します (再びMSDN on Lazy Loading から)。

When using POCO entity types, lazy loading is achieved by creating 
instances of derived proxy types and then overriding virtual 
properties to add the loading hook.

定義済みのメソッドがオーバーライドされると、プログラマーは遅延読み込みを有効にすることができます!

于 2013-07-10T16:13:05.827 に答える