4

我将 EF4.3 与 DbContext 一起使用。

我有一个存储在缓存中的实体,因此在转换为列表并将其弹出缓存之前,我需要预先加载必要的数据。

我的数据库已标准化,因此数据分布在多个表中。基本实体是“用户”,用户可能是也可能不是“订阅者”,订阅者可以是“贡献者”、“成员”或“管理员”三种类型之一

由于我缺乏 EF、Linq 等方面的知识,目前整个 fetch 不是很优雅。

    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”方法都获取一个订阅者实体以及角色类型的相关 Include() 实体。

我很确定它可以做得比这更优雅,但在最初的思考过程中挣扎。

有人帮忙吗?

更新了 Get 方法之一的示例

    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
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 回答
0

如果您的“用户”实体连接到您的其他实体,您可以使用连接实体集合的 Load 方法来获取相关实体。例如,如果您的“用户”实体具有属性“订阅者”,您可以调用 u.Subscriber.Load() 来获取相关实体。这是相关的MSDN 文章

于 2013-03-07T22:51:38.830 回答