4

DbContextでEF4.3を使用しています。

キャッシュに保存するエンティティがあるので、リストに変換してキャッシュにポップする前に、必要なデータを熱心にロードする必要があります。

私のデータベースは正規化されているため、データは複数のテーブルに分散しています。基本エンティティは「ユーザー」であり、ユーザーは「サブスクライバー」である場合とそうでない場合があり、サブスクライバーは「寄稿者」、「メンバー」、「管理者」の3つのタイプのいずれかになります。

現在、EFに関する知識が不足しているため、フェッチ全体はあまりエレガントではありません。Linqetal。

    public static User Get(Guid userId)
    {
        Guard.ThrowIfDefault(userId, "userId");

        var r = new CrudRepo<User>(Local.Items.Uow.Context);

        var u = r.FindBy(x => x.UserId == userId)
            .Include("BookmarkedDeals")
            .Include("BookmarkedStores")
            .SingleOrDefault();

        if (u.IsNotNull() && u.IsActive)
        {
            if (u.IsAdmin)
            {
                u.GetAdministrator();
            }
            else if (u.IsContributor)
            {
                u.GetContributor();
            }
            else if (u.IsMember)
            {
                u.GetMember();
            }
            else
            {
                string.Format("Case {0} not implemented", u.UserRoleId)
                    .Throw<NotImplementedException>();
            }
        }

        return u;
    }

各「Get」メソッドは、Subscriberエンティティとロールタイプに関連するInclude()エンティティを取得します。

私はそれがこれよりもはるかに精力的に行うことができると確信していますが、最初の思考プロセスに苦労しています。

誰か助けますか?

Getメソッドの1つの例で更新されました

    public static void GetMember(this User user)
    {
        Guard.ThrowIfNull(user, "user");

        var r = new ReadRepo<Subscriber>(Local.Items.Uow.Context);

        user.Subscriber = r.FindBy(x => x.UserId == user.UserId)
            .Include("Kudos")
            .Include("Member.DrawEntries")
            .Include("Member.FavouriteCategories")
            .Include("Member.FavouriteStores")
            .Single();
    }
4

2 に答える 2

0

"User" エンティティが他のエンティティに接続されている場合、接続されたエンティティ コレクションの Load メソッドを使用して、関連するエンティティを取得できます。たとえば、"User" エンティティに "Subscriber" プロパティがある場合、u.Subscriber.Load() を呼び出して関連するエンティティを取得できます。関連するMSDN の記事は次のとおりです。

于 2013-03-07T22:51:38.830 に答える
0
var u = r.FindBy(x => x.UserId == userId)
        .Include("BookmarkedDeals")
        .Include("BookmarkedStores")
        .SingleOrDefault();

if(someCondition)
{
    u = u.Include("something");
}

これをテストする場所はありませんが、試してみましたか?

于 2013-03-07T23:08:19.763 に答える