当我尝试更新 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;
}
然后我得到即时窗口输出:
我有点困惑为什么会发生这种情况,这对我来说似乎没有意义。
如果我使用自动映射器等也会发生这种情况。
我错过了什么?