(精华)2020年8月22日 ABP vNext IRepository的使用

176 阅读1分钟

上一讲我们完善了领域模型,增加了实体之间的连接关系,在诗人实体中,增加了这个诗人所写诗的集合:

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实现,我们在后面会讨论这种情况。