2017-12-06 16 views
0

更新時にEntity Framework(Core)がオブジェクトを削除するという問題があります。私はこれがAutomapperに関連していると思います(DTOリソースをオブジェクトにマップする)。私は他のオブジェクトをこのオブジェクトとまったく同じようにマップし、更新はうまく動作します。更新時にオブジェクトを削除するEntity Framework

public async Task<IActionResult> UpdateFeedback(Guid Id, [FromBody] FeedbackResource feedbackResource) 
{ 
    if (!ModelState.IsValid) 
     return BadRequest(ModelState); 
    //removing or else get a tracking error with EF 
    feedbackResource.FeedbackType = null; 
    var feedback = await feedbackRepository.GetFeedback(Id); 

    if (feedback == null) 
     return NotFound(); 

    //if I use this line to map, EF will delete the object upon save. 

    mapper.Map<FeedbackResource, Feedback>(feedbackResource, feedback); 

    // if I map manually, i get no error 
    //feedback.Title = feedbackResource.Title; 
    //feedback.Details = feedbackResource.Details; 
    //feedback.IsGoodFeedback = feedbackResource.IsGoodFeedback; 
    //feedback.IsReviewed = feedbackResource.IsReviewed; 
    //feedback.FeedbackTypeId = feedbackResource.FeedbackTypeId; 

    //if(feedbackResource.IsReviewed){ 
    // feedback.ReviewDate = DateTime.Now; 
    // feedback.ReviewedBy = UserId; 
    //} else { 
    // feedback.ReviewDate = null; 
    // feedback.ReviewedBy = null; 
    //} 

    await uow.CompleteAsync(); 

    return Accepted(feedback); 
} 

私はここで何をトラブルシューティングすればいいのか分からず、どのGoogle検索でもこの問題を見ることはできません。

+2

コードにブレークポイントを追加して、マッピング操作の結果を確認し、FeedbackResourceのすべてのプロパティがバインドされ、期待どおりに表示されるようにする必要があります。 –

答えて

0

私は同様の状況(efコア1.1)に直面しました。あなたの問題は私のものと似ていると思います。

Also a similar problem is described here

Iは、次のモデルがあります

1)ApplicatonUser - EF

2から標準ユーザー)AnyDAL - ユーザ

public class AnyDAL 
{ 
    public long Id { get; set; } 

    public long UserId { get; set; } 
    public ApplicationUser User { get; set; } 
} 
へのリンクを持っているDBの任意のクラス、

3)AnyDTO - ブラウザ側から来るモデル。以下のようなあなたの[FromBody] FeedbackResource feedbackResource

public class AnyDTO 
{ 
    public long Id { get; set; } 

    public long UserId { get; set; } 

    /// It is root of all evil. See below. 
    /// And yes, it is bad practice. 
    public ApplicationUser User { get; set; } 
} 

シナリオ:

1)データベースからAnyDALを取得します。

2)地図AnyDTOAnyDALで、AutoMapper _mapper.Map(DTO, DAL)を使用します。

3)のSaveChanges()

ある場合には、SaveChanges()を更新するために、他に、削除につながります。

私の知っておくべきこと:私の場合、AnyDTO.Userのプロパティは、逆シリアル化後に常にnullです。

削除と更新の間の選択は、マッピングの前にプロパティAnyDAL.Userの値によって異なります。

1)AnyDAL.Userがnullである - 我々はアップデートを取得します。

2)AnyDAL.Userはnullではありません。削除されます。

つまり、プロパティAnyDAL.Userがある値からnullに変更された場合、エンティティは削除されます。 AnyDAL.UserIdにもかかわらず、同じままです。

それを解決するには、2つの方法があります:

1)AnyDTOからプロパティUserを削除します。

2)プロパティAnyDTO.Userには常に値が設定されていなければなりません。

+1

同様の質問がある場合は、Answers(!)セクションを使用しないでください。新しい質問を開始してください。 –

+0

私は私の解決方法について同様の問題を説明し、問題が何であるかを示しました。 –

+0

あなた自身の問題の原因(「AnyDAL.Userが何らかの値からnullに変更されました」)のみを記述すると、修正方法がはっきりしません。あなたのコードをすべて投稿するのは本当に役に立ちません。おそらく参照が 'null'に設定されていた可能性があります。しかし、あなたがコメントできるまで待たなければなりません。 –

関連する問題