我有一个User类,它有很多帖子,post类有一个用户属性。我的问题是,在获取用户的存储库中,我调用Post存储库来获取所有用户帖子。在获取Post的存储库中,我还调用User存储库来获取海报。如何使用POCO和存储库模式处理这样的事情?
这是模型。
public class User {
public IEnumerable<Post> Posts {get; set;}
/* Other properties here */
}
public class Post {
public User Poster {get; set;}
/* Other properties here */
}
存储库代码:
public IQueryable<User> GetUsers()
{
return from u in context.Users
select new User
{
/*Other properties */
Posts = postRepo.GetPostsByUserId(u.UserId)
};
}
public IQueryable<Post> GetPostsByUserId(int userId)
{
//Well, I actually call GetPosts().Where(p => p.PosterId == userId);
return from p in context.Posts
select new Post
{
/*Other properties */
Poster = userRepo.GetUsers().Where(u => u.UserId == p.PosterId).SingleOrDefault()
};
}
如果我打电话给任何一个,我会收到错误Object not instantiated
PS。我刚刚删除了针对错误问题的问题,因此我提出了一个正确定义问题的新问题。
答案 0 :(得分:0)
你做错了;)并忽略了Linq to Sqls为相关实体正确生成连接的能力:
http://msdn.microsoft.com/en-us/library/bb399393.aspx
http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx
EF示例:
var postsWithUsers = from p in context.Posts.Include("Users")
select new Post
良好的文档: http://msdn.microsoft.com/en-us/library/bb896272.aspx
答案 1 :(得分:0)
您想在DataContext的存储库模式之上实现自己的存储库模式吗?您希望您的存储库能够毫不费力地在数据库类型和域类型之间进行转换吗?
通过返回延迟查询,您似乎无法控制何时发生数据库访问。
由于查询被推迟,您的上下文会暂停一段时间,所以您可能不会在工作单元之后处理它。你正在为陈旧的数据做好准备。
public Domain.User GetUserWithPostsById(int userId)
{
DataLoadOptions myOptions = new DataLoadOptions();
myOptions.LoadWith<User>(u => u.Posts);
User record = null;
using (MyDataContext myDC = new MyDataContext(connString))
{
myDC.LoadOptions = myOptions;
record = myDC.Users.Single(u => u.UserId = userId);
}
Domain.User result = TranslateUserWithPostsToDomain(record);
return result;
}