私はMVC3プロジェクトに取り組んでおり、そのレコードがUIから更新されると、データベースの特定のフィールドがnullに設定されていることに気付きました。これは、これらのフィールドが投稿のフォームに存在しないために発生します。これらのHiddenForエントリを追加することでこれを解決できることはわかっていますが、新しいフィールドもそこに追加する必要があるため、これは優れたアプローチではありません。私はより良い解決策を見つけたいと思っています。
プロジェクトがどのように構成されているかについて少し詳しく説明します。
マッピングを簡素化するために、EFエンティティと正確に一致するDTOがあります。したがって、DTOには、エンティティとデータベースに存在するすべてのフィールドがあります。モデルとしてDTOを使用します。
コントローラはDTOをサービスレイヤーに渡します。サービスレイヤーは、DTOをそれぞれのエンティティにマップし(AutoMapperを使用)、永続レイヤーに渡します。永続層は、実際にDbContextを使用して変更を保存するものです。
NameメンバーとFolderPathメンバーを持つクライアントDTOがあり、フォームにNameメンバーのみがあるビューがあるとします。フォームが投稿され、そのFolderPathはnullです。そのnull値は、永続層の更新までずっと持続します。どこかで、その特定の値がデータベースの内容を上書きしないように指定する必要があります。
私がこれをSOで約1時間調査して集めたものから、1つのアプローチは...
- ビュー内のフォームにあることがわかっている特定のフィールドのセットに対して、DTOのスコープを最小限に抑えます。
- AutoMapperに、この回答に従って宛先に存在するがソースには存在しないものをすべて無視するように指示します。
- サービスレイヤーでは、DTOをエンティティにマッピングするときに、最初にデータベースから既存のエンティティを取得します。マッピングは、DTOの一部であるメンバーのみを上書きし、他の値はデータベースから取得されているため、保持されます。
これは有効なアプローチでしょうか?この問題に対処するためのより良いまたはより一般的な方法はありますか?