0

Entity Framework Core でナビゲーション プロパティを更新しようとすると、値が null に設定され、データベースからレコードが削除されるという異常な動作が発生します。

簡単な例:

public class Hla : BaseEntity
{
    public string AField1 { get; set; }
    public virtual Patient Patient { get; set; }
    public int PatientId { get; set; }
}

public class Patient : BaseEntity
{
    public string Test { get; set; }
    public virtual Hla Hla { get; set; }
}

public class PatientRepository : Repository, IPatientRepository
{
    private readonly SearchAndMatchContext _context;

    public PatientRepository(SearchAndMatchContext context) : base(context)
    {
        _context = context;
    }

    public async Task<Patient> RetrieveEntity(int id)
    {
        return await _context.Patients
            .Include(t=>t.Hla)
            .FirstOrDefaultAsync(t => t.Id == id);
    }

    public  void UpdateEntity(Patient entity)
    {
        _context.Patients.Update(entity);
    }
}

問題の原因となっているコード:

private static Hla Map(Hla original, Hla update)
{
    var  fieldsToSkip = new string[]{"Id"};
    
    PropertyInfo[] fields = update.GetType().GetProperties();

    foreach (var field in fields)
    {
        if (fieldsToSkip.Contains(field.Name))
        {
            continue;
        }

        var newValue = field.GetValue(update);
        field.SetValue(original, newValue);
    }

    return original;
}

var patient = await _patientRepository.RetrieveEntity(1);

Map(patient.Hla, new Hla
    {
        AField1 = "dfgdfg",
        PatientId = patient.Id
    });

patientRepository.UpdateEntity(patient);
await _patientRepository.UnitOfWork.SaveChangesAsync();

SaveChangesAsyncが呼び出されるとすぐに、はHlanull に設定されます - イミディエイト ウィンドウからの出力:

ここに画像の説明を入力

一方、単純な「ダイレクト」マッパーがある場合は、完全に機能するようです。

より単純なマッパー:

private static void Map(Hla current, Hla update)
{
    current.AField1 = update.AField1;
}

次に、即時ウィンドウ出力を次のように取得します。

ここに画像の説明を入力

なぜこれが起こるのか少し混乱しています。私には意味がないようです。

これは、オートマッパーなどを使用した場合にも発生します。

私は何が欠けていますか?

4

2 に答える 2