2016-08-02 58 views
0

我在它的一类myEntity所用的集合:ASP.NET Core仅返回集合的第一值在实体

public class MyEntity 
{  
    [Key] 
    public int MyId { get; set; } 
    [Display(Name = "Process Name")] 
    public string ProcessName { get; set; } 
    public ICollection<Step> ProcessSteps { get; set; } 
} 

带班步骤A一对多关系:

public class Step 
{ 
    ... 
    [ForeignKey("MyEntityForeignKey")] 
    public MyEntity { get; set; } 
} 

下面是API调用返回指定myEntity所:

public async Task<IActionResult> MyEntity(int? id) 
{ 
    if (id == null) 
    { 
     return Ok(await _context.MyEntity.ToListAsync()); 
    } 

    var process = _context.MyEntity.Where(f => f.MyId == id).Include(g => g.ProcessSteps); 

    if (process.Count() == 0) 
    { 
     return NotFound(); 
    } 

    return Ok(process.First()); 
} 

运行此,一切看起来除了在t大他收集。在调试时,显示正确的值。即使我在这些集合中有2+项,它总是只返回来自MyClass的ProcessSteps集合中的第一个项目,当它返回响应 Ok

编辑:

它看起来好像回到我的连接外键的反应是罪魁祸首。迭代并清零外键似乎已经修复了一些问题。

foreach (Step step in MyEntity.ProcessSteps) 
{ 
    Step.MyEntity = null; 
} 

return Ok(MyEntity.ProcessSteps) 
+0

如果你在'var process'后面放置一个断点并检查内存中的对象,在ProcessSteps下显示多个项目? –

+2

不一定相关,但应该使用'FirstOrDefault()'并检查'null',而不是先运行Count(),然后再运行First()。后者将运行两个查询。 – poke

+2

@NateBarbettini'process'只是一个尚未执行的查询语句,因此没有任何内容从数据库加载。 – poke

回答

0

我有一个类似的问题,其中只有目标集合的第一个实体被返回,除非我设置为null来删除所有内部引用。
但是我能够通过在返回它之前将我的模型映射到dto对象(或ViewModel)来解决此问题。 dto通常具有模型实体的子集。这样我就不必将null设置为null。

总的来说,我认为这是一个很好的做法,返回给客户端只有那些严格需要属性,而不给整个模型对象。