2016-08-02 4 views
0

エンティティでコレクションの最初の値を返す:ASP.NETコアは唯一、私はその中にコレクションを持つクラス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; } 
} 

クラスステップと1対多の関係:

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つ以上のアイテムがありますが、レスポンスが返されたときは常にProcessStepsコレクションの最初のアイテムがMyClassから返されます。 Ok

編集:

これは、添付の私の外部キーが犯人だったとの応答を返すように見えます。外来キーの反復とヌル化は、固定されたものを持つようです。

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

return Ok(MyEntity.ProcessSteps) 
+0

'var process'の直後にブレークポイントを置き、メモリ内のオブジェクトを調べると、' ProcessSteps'の下に複数の項目が表示されますか? –

+2

必ずしも関連しているわけではありませんが、最初に 'Count()'を実行してから 'First()'を再度実行するのではなく、 'FirstOrDefault()'を使って 'null'をチェックしてください。 Latterは2つのクエリを実行します。 – poke

+2

@NateBarbettini 'process'はまだ実行されていないクエリ可能なものなので、データベースから何もロードされません。 – poke

答えて

0

私はすべての内部参照をnullに設定しない限り、ターゲットコレクションの最初のエンティティのみが返された同様の問題がありました。
しかし、これを解決するには、モデルをdtoオブジェクト(またはViewModel)にマッピングして戻してください。 dtoは、通常、モデルエンティティのサブセットを持ちます。このようにして、内部参照をnullにする必要はありませんでした。

一般的に私は、が完全にモデルオブジェクトを与えることなく、厳密に必要とされるプロパティのみをクライアントに返すことをお勧めします。

関連する問題