实体框架包括属性和存储库模式

问题描述 投票:0回答:2

我有,比如说,含表论坛和主题数据库。每个主题都有一个外键其父论坛。

其相关的C#模型论坛和主题论坛,并有指向其子主题的ICollection的。我有我使用直接访问实体框架的情况下,我只能从它返回论坛/ IEnumerable的一个论坛库。该应用程序的其余部分只能通过这个信息库访问数据库。我的问题是:在某个时间点上,我想,说,数据库中的所有论坛不填充主题属性。要做到这一点,我必须有一个方法是GETALL会做这样的:返回_context.Forums.ToList();.

但现在假设我也想在某个时候返回所有的论坛,但他们的主题填充属性。我想我可以在版本库创建一个新的方法(称为GetAllForumsWithTopics或东西),但似乎怪异我想包括更多的领域(也许在某些时候,我也希望包括该主题的财产每次创建一个新方法,说其帖子列表..然后我不得不去喜欢GetAllForumsWithTopicsWithPosts?)。

所以,我想以某种方式定义一个方法GetAllForums(“includelist”)[编辑:我其实不喜欢一个字符串作为参数,但lambda表达式:)]的方法,让我到包括上下分层特性(不仅为自己论坛)。什么是这样做的一个好办法吗?

c# entity-framework-core repository-pattern
2个回答
2
投票

可能是一个好主意,写出来你试图做的代码。我在读这个问题的方法是,你必须像下面这样:

public class Forum
{
    public int Id {get; set;}
    public IEnumerable<Topic> Topics {get; set;}
}

public class Topic
{
    public int Id {get; set;}
    public Forum Forum {get; set;}
}

有要解决这几个方面。这听起来像你已经知道了虚拟和非虚拟的区别,当谈到它多么渴望加载内容。您可以使用包括物业选择包括子元素(参见:https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

就个人而言,路线我可能会接近这个是我的EF实现类(即实现了在其他位置使用的接口),有两个get方法:

public virtual IQueryable<Forum> Forums => _context.Forums;
public virtual IQueryable<Forum> ForumsWithChildren => _context.Forums.Include(m => m.Topic)

在这种“真实世界”的应用程序,应该有一个时间限制,只有通过特定的论坛呼叫拉动主题:

public virtual Forum GetForumWithRecentPosts(int id)
{
    //Add where clause to restrict based off date.
    return Forums.Where(x => x.Id == id).include(m => m.Topic);
}

1
投票

您可以创建一个过载,它接受的东西,包括一个表达。

public IQueryable<T> GetAll(params Expression<Func<T, object>>[] includes)
{
    var query = _ctx.Set<T>().AsQueryable();
    return includes.Aggregate(query, (q, w) => q.Include(w));
}

并使用它像这样:

var forumsWithTopics = _forumRepository(q => q.Topics).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.