【发布时间】:2019-10-10 12:37:26
【问题描述】:
我有一个使用 EagerLoading 拉回实体的服务。 在大多数情况下,这是可行的,但我最近发现了一个问题。 我有一个字段:
public class Field
{
[Required] public int Id { get; set; }
[Required, MaxLength(100)] public string CategoryId { get; set; }
[Required, MaxLength(100)] public string Name { get; set; }
public FieldDataType DataType { get; set; }
public bool IsSpecification { get; set; }
public IList<FieldMap> FieldMaps { get; set; }
}
如您所见,它有一组与之关联的FieldMaps。 FieldMap 如下所示:
public class FieldMap
{
public int Id { get; set; }
public int FeedId { get; set; }
public int FieldId { get; set; }
[Required, MaxLength(100)] public string Path { get; set; }
public Field Field { get; set; }
}
在我的 DbContext 中映射如下:
modelBuilder.Entity<Field>().HasMany(m => m.FieldMaps).WithOne().HasForeignKey(m => m.FieldId);
// Unique constraints
modelBuilder.Entity<Field>().HasIndex(m => new { m.CategoryId, m.Name, m.IsSpecification }).IsUnique();
modelBuilder.Entity<FieldMap>().HasIndex(m => new { m.FeedId, m.Path }).IsUnique();
// Disable cascade delete
modelBuilder.Entity<FieldMap>().HasOne(m => m.Field).WithMany(m => m.FieldMaps).OnDelete(DeleteBehavior.Restrict);
问题是,当我调用 List 方法时,它会永远拉回所有项目:
我的列表方法是这样的:
public IQueryable<T> List(params string[] includes)
{
IQueryable<T> query = _dbEntitySet;
return includes == null ?
query :
includes.Aggregate(query, (current, include) => current.Include(include));
}
我这样调用它:
[HttpGet("{id:int}/fields")]
[ProducesResponseType(typeof(List<Field>), StatusCodes.Status200OK)]
public IActionResult ListFieldMaps(int id)
{
var feeds = _feedService.List();
var feed = feeds.SingleOrDefault(m => m.Id.Equals(id));
if (feed == null) return NotFound();
var fieldMaps = _fieldMapService.List("Field");
if (fieldMaps.Any(m => m.Field == null)) return BadRequest(Resources.NullFieldError);
return Ok(fieldMaps.Where(m =>
m.FeedId.Equals(id) &&
m.Field.IsSpecification == (feed.Type == FeedType.Specification)).ToList());
}
如您所见,它应该只加载带有一个 Field 的 FieldMaps 列表,而不是之后的其余 fieldmaps。
有人可以帮我解决这个问题吗?
【问题讨论】:
标签: entity-framework entity-framework-core eager-loading