子テーブルの行を更新すると、エンティティフレームワークコア(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がすべての親プロパティにセッターを設定するか、いくつかの設定が欠落していると思いますか?おそらく私のアプローチには目立った欠陥がありますか?
はい、しかし、彼はノートに注意してください.NoteTypeはnullではなく、Idは0です、そうですか? :)これは、逆のマップとデフォルトの平坦化/非平坦化のためです。 –
私はそれが目的が何であるかによって決まると思います。 Note.NoteTypeをnullにする目的があれば、私の答えが適用されます。 –
ありがとう!ペニーは落ちた:)。追加の設定は、平滑化されていないidが設定されるように追加する必要があります。 (なぜ私はオートマッパがドットを結ぶと思ったのかわかりません)。 – Craig