2017-07-12 7 views
1

.NET MVC5テンプレートをASPNETZEROの.NETコアMVCテンプレートに変換する処理中です。 MVC5のテンプレートソリューションで必要としているように、私が変換しているコードはすべて動作しています。私のメソッドコードを以下に示します。ASPNETBOILERPLATE - .NETの関連エンティティを返さないアプリケーションサービスメソッド

public async Task<EditCompanyDto> GetCompanyForEdit(NullableIdDto input) 
    { 
     var companyEditDto = (await _companyRepository.GetAsync((int)input.Id)); 
     var cmp = companyEditDto.MapTo<EditCompanyDto>(); 
     return cmp; 
    } 

このコードは、MVC5テンプレートで完全に機能し、アドレス、連絡先、メモの関連エンティティを返します。 .NET Coreソリューションでは、この同じコードは上記のメソッドでAddressコレクションとContactコレクションのみを返します。これは、NoteコレクションをNULLとして戻し続けます。

以下は私の会社のエンティティです。私はこの記事のいくつかのフィールドを削除しましたが、すべてのナビゲーションプロパティを残しました。

public class Company : FullAuditedEntity, IMustHaveTenant 
{ 

    public string CompanyTaxId { get; set; } 

    public bool ActiveYesNo { get; set; } 

    public virtual NoteHeader Note { get; set; } 

    public virtual List<CompanyAddress> Addresses { get; set; } 

    public virtual List<CompanyContact> Contacts { get; set; } 

    public virtual int TenantId { get; set; } 

    public Company() 
    { 
     Addresses = new List<CompanyAddress>(); 
     Contacts = new List<CompanyContact>(); 
    } 

} 
+0

遅延読み込みはEFコアでサポートされていません。 https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading –

+0

はい、私はその制限を認識しています。ただし、GetAsync()呼び出しで連絡先とアドレスコレクションが返されています。それはヌルに戻ってきているノートエンティティです。私はそれを理解していませんか? – exlnt

+0

@exlnt https://stackoverflow.com/a/48403796/6527049 –

答えて

1

あなたは注コレクションを言います。私が見る限り、コレクションではありません。それがコレクションだとしましょう。 ガブリエルのアプローチは正しいです。しかし、Noteフィールドは含まれていませんでした。その結果、あなたのコードは、この

var company = _companyRepository.GetAll() 
           .Include(c => c.Addresses) 
           .Include(c => c.Contacts) 
           .Include(c => c.Note) 
           .FirstOrDefault(x => x.Id == input.Id); 

ノートのようにする必要があります:のgetAll()を使用すると、データベースからすべてのデータをつかむという意味ではありません。 GetAll()はIQueryableを返します。したがって、後にLinqメソッドを追加することができます。しかし、GetAllList()を使うと、それはテーブルからすべてのデータを取得します。

2

Includeメソッドを使用してコレクションを読み込みます。

あなたはこのようにそれを使用することができます:

var company = _companyRepository.GetAll() 
           .Include(c => c.Addresses) 
           .Include(c => c.Contacts) 
           .FirstOrDefault(x => x.Id == input.Id); 
+0

ありがとうございます!私は、.NETコアでN/Aとなっている遅延ロード機能を認識しています。私はまた、インクルードメソッドを見つけました。しかし、私の心配は、このアプローチを使用することは、すべての "GetForEdit"メソッドがGetAll()を使用する場合、これは私のアプリのパフォーマンスに何をするのだろうか?理由がないのにたくさんのデータがロードされていませんか?確かにこれに支払うパフォーマンスの価格があります。これは、アプリケーションが大量のデータを持つと、スケールアップできる持続可能なデザインのようには見えません。 – exlnt

+0

あなたのソリューションは非常にうまく動作しました、ありがとう!しかし、このオプションの実行に対する懸念は、私にはまだ関係しています。 – exlnt

+0

@exlnt複数のアプリケーションサービスメソッドを持つことができます。 1つはコレクションを含めるもの、他は含まないものです。 –

1

@Alperありがとう! NoteHeaderエンティティには、NoteDetailsのコレクションが含まれています。つまり、Noteコレクションが存在します。私は既に@ Gabrielのコード提案を実装し、実際にそれを追加して、私が必要とするものを正確に得ることができました。

var companyEditDto = _companyRepository.GetAll() 
          .Include(c => c.Addresses) 
          .Include(c => c.Contacts) 
          .Include(c => c.Note).ThenInclude(N => N.Notes) 
          .FirstOrDefault(x => x.Id == input.Id); 
関連する問題