EF中Include方法的自定义功能

时间:2016-12-20 12:18:21

标签: c# entity-framework asp.net-core repository-pattern entity-framework-core

我使用EF Core 1创建ASP.NET Core 1应用程序。我有两个类具有一对多关系,如下所示

 public class Country: EntityBase
 {
    public string Name { get; set; }

    // fields for relations

    public IQueryable<Singer> Singers { get; set; }
 }

 public class Singer : EntityBase
 {
    public string Name { get; set; }

    // fields for relation

    public int CountryId { get; set; }
    public virtual Country Country { get; set; }
 }

他们的映射

 public class SingerMap
 {
    public SingerMap(EntityTypeBuilder<Singer> entityBuilder)
    {
        entityBuilder.HasKey(x => x.Id);
        entityBuilder.Property(x => x.Id).ValueGeneratedOnAdd();

        entityBuilder.Property(x => x.Name).HasMaxLength(500);

        //relational fields
        entityBuilder.HasOne(x => x.Country).WithMany(x => x.Singers).HasForeignKey(x => x.CountryId);
    }
 }

 public class CountryMap
 {
    public CountryMap(EntityTypeBuilder<Country> entityBuilder)
    {
        entityBuilder.HasKey(x => x.Id);
        entityBuilder.Property(x => x.Id).ValueGeneratedOnAdd();
        entityBuilder.Property(x => x.Name).HasMaxLength(500);
    }
 }

我为这些实体创建了通用的存储库模式。包含属性的功能如下

  public virtual IEnumerable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties)
    {
        IQueryable<T> query = _context.Set<T>();
        foreach (var includeProperty in includeProperties)
        {
            query = query.Include(includeProperty);
        }
        return query.AsEnumerable();
    }

我称这种方法

    [HttpGet]
    public JsonResult GetAllForIndex()
    {
        var result = Service.AllIncluding(x => x.Country);
        return Json(result);
    }

在此之后我收到此错误

  

导航属性的类型&#39; Singers&#39;在实体类型&#39;国家&#39;   是真的可以&#39; IQueryable&#39;为此无法创建   具体实例。在使用之前初始化属性,添加一个   public参数类型的无参数构造函数,或者使用可以的类型   被分配一个HashSet&lt;&gt;或列表&lt;&gt;。

我对解决方案一无所知。 请帮忙。

1 个答案:

答案 0 :(得分:2)

public IQueryable<Singer> Singers { get; set; }

应该是

public List<Singer> Singers { get; set; }

Exception消息几乎说明了什么是错误的,应该更改为什么。您几乎可以使用源自HashSet<>List<>

的任何类型