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
が呼び出されるとすぐに、はHla
null に設定されます - イミディエイト ウィンドウからの出力:
一方、単純な「ダイレクト」マッパーがある場合は、完全に機能するようです。
より単純なマッパー:
private static void Map(Hla current, Hla update)
{
current.AField1 = update.AField1;
}
次に、即時ウィンドウ出力を次のように取得します。
なぜこれが起こるのか少し混乱しています。私には意味がないようです。
これは、オートマッパーなどを使用した場合にも発生します。
私は何が欠けていますか?