【发布时间】:2016-11-06 21:30:06
【问题描述】:
我有一个 MyEntity 类,里面有一个集合:
public class MyEntity
{
[Key]
public int MyId { get; set; }
[Display(Name = "Process Name")]
public string ProcessName { get; set; }
public ICollection<Step> ProcessSteps { get; set; }
}
与类 Step 的一对多关系:
public class Step
{
...
[ForeignKey("MyEntityForeignKey")]
public MyEntity { get; set; }
}
以下是返回指定 MyEntity 的 API 调用:
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());
}
运行它时,除了集合之外,一切看起来都很棒。调试时,会显示正确的值。即使我在这些集合中有 2 个以上的项目,当它返回响应 Ok 时,它总是只返回来自 MyClass 的 ProcessSteps 集合中的第一个项目。
编辑:
看起来返回带有我的外键的响应是罪魁祸首。遍历外键并清空外键似乎已经解决了问题。
foreach (Step step in MyEntity.ProcessSteps)
{
Step.MyEntity = null;
}
return Ok(MyEntity.ProcessSteps)
【问题讨论】:
-
如果您在
var process之后放置一个断点并检查内存中的对象,是否会在ProcessSteps下显示多个项目? -
不一定相关,但您应该使用
FirstOrDefault()并检查null,而不是先运行Count(),然后再运行First()。后者将运行两个查询。 -
@NateBarbettini
process只是一个尚未执行的可查询对象,因此不会从数据库中加载任何内容。 -
您能否展示您的数据库上下文配置以查看从
MyEntity到Step的映射是如何配置的? -
@NateBarbettini 它在调试时确实显示了多个项目。它仅在 JSON 输出中返回 ProcessSteps 的单个值。
标签: entity-framework asp.net-core entity-framework-core