1

データベースからすべてのデータを取得するのに問題があり、何が間違っているのか完全にはわかりません。これはほとんどすべて私にとって新しいことです。

私はSOを検索し、私のものと非常によく似ている次の質問を見つけました- エンティティフレームワークと子オブジェクトのリポジトリパターン

私はこのリンクを含む答えを見てきましたが、これを機能させるのに苦労しています。

キャンペーンを返すキャンペーンリポジトリがあります。期待どおりに監査のリストが返されますが、監査にはコメントまたはCampaignActionが含まれていません。DBにすべてのカスケードオブジェクトを引き出すように指示するために必要な特別なことはありますか?

助けてくれてありがとう

ニール

    public override Campaign Get(int id)
    {
        var query = Context.Campaigns.Include(x => x.Audits)
                                     .FirstOrDefault(c => c.CampaignId == id);
        if (query != null) 
            Logger.Trace(query.ToString());
        return query;
    }

キャンペーンクラスがあります

public class Campaign
{
    public Campaign()
    {
        Audits = new Collection<Audit>();
    }

    public int CampaignId { get; set; }

    [StringLength(40, ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "CampaignModel_Name_StringLength")]
    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "CampaignModel_Name_Required")]
    [Display(Name = "CampaignModel_Name", ResourceType = typeof(Resources.Resources))]
    public string Name { get; set; }

    public ICollection<Audit> Audits { get; set; }
}

そして私の監査クラス

public class Audit
{
    public Audit()
    {
        Comments = new Collection<Comment>();
    }

    public int AuditId { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "Audit_CampaignAction_Required")]
    [Display(Name = "Audit_CampaignAction", ResourceType = typeof(Resources.Resources))]
    public CampaignAction Action { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "Audit_UserName_Required")]
    [Display(Name = "Audit_UserName_Content", ResourceType = typeof(Resources.Resources))]
    public string UserName { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "Audit_TimeStamp_Required")]
    [Display(Name = "Audit_TimeStamp", ResourceType = typeof(Resources.Resources))]
    public DateTime TimeStamp { get; set; }

    public ICollection<Comment> Comments { get; set; }

    [JsonIgnore]
    public virtual ICollection<Campaign> Campaigns { get; set; }
}
4

1 に答える 1

2

積極的な読み込みを使用している限り、Include()データベースから読み込みたいすべてのエンティティを呼び出す必要があります。このルールは、子エンティティ(監査)だけでなく、孫(アクションとコメント)にも適用されます。

通常、孫を含めるには単純なドット表記を使用しますが、子エンティティがコレクションである場合は、Select()メソッドを使用する特別な構文があります。

クエリは次のようになります

var query = Context.Campaigns.Include(x => x.Audits)
                             .Include(x => x.Audits.Select(a => a.Comments))
                             .Include(x => x.Audits.Select(a => a.Action))
                             .FirstOrDefault(c => c.CampaignId == id);
于 2012-06-01T10:52:06.673 に答える