2017-10-04 11 views
1

子テーブルの行を更新すると、エンティティフレームワークコア(2.0)が親テーブルに対して追加作業を実行している状況があります。 AutoMapperによって生成された平坦化されていないオブジェクトツリーに設定されていない値を指摘しました(私はAutoMapperでエラーが発生しているとは言えませんが、おそらく私のコードと関係があります)。automapper unflattenは親オブジェクトから値を除外します

API開発側では、ASP.NET Core 2.0、C#、EF Core 2.0、AutoMapperを使用しています。データベースはすでに存在し、EFクラスはそこから足場を取ります。

簡潔にするために、子テーブルはNoteで、親テーブルはNoteTypeです。次のようにEFクラス(削除余分な列)は、次のとおりです。

//Entity classes 
public partial class Note 
    { 
     public int NoteBookId { get; set; } 
     public short NoteSeqNo { get; set; } 
     public short NoteTypeId { get; set; } 
     public string NoteText { get; set; } 

     public NoteBook NoteBook { get; set; } 
     public NoteType NoteType { get; set; } 
    } 

public partial class NoteType 
    { 
     public NoteType() { Note = new HashSet<Note>(); } 
     public short NoteTypeId { get; set; } 
     public string NoteTypeDesc { get; set; } 
     public ICollection<Note> Note { get; set; } 
    } 

//DTO class 
    public class NoteDto 
    { 
     public int NoteBookId { get; set; } 
     public short NoteSeqNo { get; set; } 
     public short NoteTypeId { get; set; } 
     public string NoteTypeNoteTypeDesc { get; set; } 
     public string NoteText { get; set; } 
    } 

public class NoteTypeDto 
    { 
     public short NoteTypeId { get; set; } 
     public string NoteTypeDesc { get; set; } 
    } 
  • (NoteBookId + NoteSeqNo)注の主キーです。
  • NoteTypeIdはNoteTypeの主キーです。

設定

これはAutoMapper構成です:

// config in startup.cs 
config.CreateMap<Note,NoteDto>().ReverseMap(); 
config.CreateMap<NoteType,NoteTypeDto>().ReverseMap(); 

私が期待される結果と親ノートを取得し、データ検索の結果としてデータ

を読みますタイプの説明が入力されます。

// EF get note in repository 
      return await _dbcontext.Note 
       .Where(n => n.NoteId == noteId && n.NoteSeqNo == noteSeqNo) 
       .Include(n => n.NoteType) 
       .FirstOrDefaultAsync(); 

// Get note function in API controller 
       Note note = await _repository.GetNoteAsync(id, seq); 
       NoteDto noteDto = Mapper.Map<NoteDto>(note); 

例JSON結果:プロセスが更新中反転さ

{ 
    "noteBookId": 29, 
    "noteSeqNo": 19, 
    "noteTypeId": 18, 
    "noteTypenoteTypeDesc": "ABCDE", 
    "noteText": "My notes here." 
} 

更新データは、APIコントローラがエンティティ

Mapper.Map<Note>(noteDto) 
にDTOをマッピング

その後、担当者がEFに渡したとき0であり、そして18その値が割り当てられていない

Note 
    NoteBookId = 29 
    NoteSeqNo = 19 
    NoteTypeId = 18 
    NoteTypeNoteTypeDesc = "ABCDE" 
    NoteText = "My notes updated." 
    NoteType.NoteTypeDesc = "ABCDE" 
    NoteType.NoteTypeId = 0 

親IDカラム(NoteType.NoteTypeId)値:ositoryコード、EFは、平坦化されないオブジェクトツリーは次のようになりID 0とNoteType行を追加しようと私が期待したものです。

(私は手動でNoteType.NoteTypeIdを18に設定して、EFが何もしないようにしました)。

これを回避するには、リポジトリコードのNoteのNoteTypeを無効にします。

AutoMapperがすべての親プロパティにセッターを設定するか、いくつかの設定が欠落していると思いますか?おそらく私のアプローチには目立った欠陥がありますか?

答えて

0

AutoMapperがマッピングを元に戻すとき、フラットオブジェクトからネストされたオブジェクトのすべての情報を収集する必要があります。あなたのDTOは、マッピングNoteType -> NoteTypeDescの値しか運びません。 NoteType -> NoteTypeIdではないので、AMは本当にその価値をどこから得るか考えていません。

あなただけの平坦化に依存する場合、それを変更する唯一の方法は、平坦化されない1以外のDTOに平らにNoteTypeIdを追加することです:

public class NoteDto 
{ 
    public int NoteBookId { get; set; } 
    public short NoteSeqNo { get; set; } 
    public short NoteTypeId { get; set; } // Not flattened 
    public short NoteTypeNoteTypeId { get; set; } // Flattened 
    public string NoteTypeNoteTypeDesc { get; set; } 
    public string NoteText { get; set; } 
} 

代替は、あなたにこれを追加することですマッピング:

config.CreateMap<Note, NoteDto>() 
    .ForMember(dest => dest.NoteTypeId, 
     e => e.MapFrom(src => src.NoteType.NoteTypeId)) 
    .ReverseMap(); 
+0

はい、しかし、彼はノートに注意してください.NoteTypeはnullではなく、Idは0です、そうですか? :)これは、逆のマップとデフォルトの平坦化/非平坦化のためです。 –

+0

私はそれが目的が何であるかによって決まると思います。 Note.NoteTypeをnullにする目的があれば、私の答えが適用されます。 –

+0

ありがとう!ペニーは落ちた:)。追加の設定は、平滑化されていないidが設定されるように追加する必要があります。 (なぜ私はオートマッパがドットを結ぶと思ったのかわかりません)。 – Craig

0

MapFrom-s(デフォルトの非平坦化を含む)are reversed now。 ReverseMapを削除してマップを作成したり、Note.NoteTypeを無視したり、問題のパスを無視したりすることができます。Note.NoteType.NoteTypeDesc。

+0

あなたのご意見ありがとうございましたが、あなたの提案が私にどのように役立つのか理解できません。私はリバースマップを削除したくないし、NoteTypeを無視したくない。 AutoMapperがNoteTypeを完全に非平坦化していない理由を本当に知りたいです。 – Craig

+0

私はリンク先の文書を読んでいますか? :) –

関連する問題