上一讲我们完善了领域模型,增加了实体之间的连接关系,在诗人实体中,增加了这个诗人所写诗的集合:
using System.Collections.Generic;
using Volo.Abp.Domain.Entities;
namespace ZL.AbpNext.Poem.Core.Poems
{
/// <summary>
/// 诗人,从ABP Entity派生
/// </summary>
public class Poet : Entity<int>
{
/// <summary>
/// 姓名
/// </summary>
public virtual string Name { get; set; }
/// <summary>
/// 介绍
/// </summary>
public virtual string Description { get; set; }
/// <summary>
/// 写的诗
/// </summary>
public virtual ICollection<Poem> Poems { get; set; }
}
}
现在我们修改一下客户端中的Service,看是否能够取出相应的数据:
public void Run()
{
//Console.WriteLine("你好");
using (var uow = uowManager.Begin(new AbpUnitOfWorkOptions()))
{
//获取第一个诗人
var poet = repository.FirstOrDefault();
Console.WriteLine(poet.Name);
Console.WriteLine(poet.Poems.Count());
}
}
运行程序,出现错误,poet.Poems为空,说明reposity不能自动加载相关实体,我们需要使用Include显示加载,因为IRepository派生自IQueryable,因为我们使用EF,所以可以使用Include扩展,修改代码如下:
public void Run()
{
//Console.WriteLine("你好");
using (var uow = uowManager.Begin(new AbpUnitOfWorkOptions()))
{
//获取第一个诗人
//var poet = repository.FirstOrDefault();
var poet = repository.AsQueryable().Include(p => p.Poems).FirstOrDefault();
Console.WriteLine(poet.Name);
Console.WriteLine(poet.Poems.Count());
Console.WriteLine(poet.Poems.ToList()[0].Author.Name);
}
}
这样就可以了:
这里我们使用了Abp vNext 提供的IRepository通用实现,在实际应用中,需要编写有针对性的IRepository实现,我们在后面会讨论这种情况。