3

現在、プロキシの作成を無効にしています。

context.Configuration.ProxyCreationEnabled = false;

私はそのようなデータモデルを持っています(関連のないフィールドを削除しました):

public partial class Video
{    
    public int VideoID { get; set; }
    public string Title { get; set; }
    public int UserID { get; set; }

    public virtual User User { get; set; }
}

public partial class User
{
    public User()
    {
        this.Videos = new HashSet<Video>();
    }

    public int UserID { get; set; }
    public string Username { get; set; }

    public virtual ICollection<Video> Videos { get; set; }
}

Unit of Work と Repository パターンを使用してデータをロードしています。

ユーザー オブジェクトを含むすべてのビデオを取得します。

var videos = videoService
                .Include(v => v.User)
                .Get()

automapper を使用して、データ モデルからドメイン モデルにマップしています (したがって、下のスクリーンショットの UI 名前空間)。戻ってきたビデオ列挙を調べて、列挙の最初の項目を確認すると、ユーザー オブジェクトを確認します。

ここに画像の説明を入力

ここで私が期待しているのは、VideoModel がデータで満たされ (ok)、単一の UserModel エンティティだけがデータで満たされ (ok)、UserModel 内のすべてのコレクションが空になることです (これは壊れています)。上の 2 番目の赤いボックスでわかるように、Videos コレクションには 6 つのビデオが取り込まれています。これらのビデオでは、ユーザーのビデオが埋められます。したがって、これは基本的に非常に大きなオブジェクト グラフを作成します。

1) インクルードを使用するときに、1 レベルの深さだけになるようにすることはできますか (IE は Video.User.Videos を埋めません)。

2) ProxyCreationEnabled = false がこれを処理しないのはなぜですか? 期待しすぎですか?

ps automapper を使用して、このための顧客マッパーを作成することは避けたいと思います。pps私は最初にモデルではなく、データベースを最初にやっています

4

1 に答える 1

0

既定では、EntityFramework は仮想プロパティに遅延読み込みを使用します (例ではUserandなどVideos)。これらのプロパティが実際にアクセスされる前に埋められるようにしたい場合は、 or を使用して、ネストされた をInclude()さらに深くすることができます。Include()Select()

ただし、このデフォルトの動作は、明らかにオフにしたプロキシ クラスの作成に依存しています。

あなたがやろうとしていることをすべて知っているわけではないので、これはうまくいかないかもしれませんが、単に削除してそのままProxyCreationEnabled = false使用するだけで、必要な動作が得られるようですInclude()

また、デバッガーでプロパティを表示しようとすると、実際にはプロパティにアクセスしているため、デバッガーでプロパティを表示すると誤解を招く可能性があります (これにより、遅延ロードされたエンティティまたはコレクションがすぐにいっぱいになり、熱心に読み込まれたと思われる可能性があります)。ロード済み)。

于 2013-07-15T19:33:37.843 に答える