Я пытаюсь выяснить, как пометить определенные свойства отдельного объекта как измененные. Если я сделаю следующее, он пометит все свойства измененными и сгенерированный sql обновит все столбцы.
/// <summary>
/// Sets the entity in the modified state.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity">The entity.</param>
void IDbContext.Modified<T>(T entity)
{
DbEntityEntry<T> entry = Entry(entity);
if (entry.State == EntityState.Modified)
{
// if the state is already Modified we don't need to do anything else
return;
}
if (entry.State == EntityState.Detached)
{
Set<T>().Attach(entity);
//TODO: set specific properties modified instead of the the whole object.
entry.State = EntityState.Modified;
}
}
Как установить только измененные свойства как измененные?
Я пытаюсь использовать это в классе, который реализует DbContext
, который будет использоваться универсальным репозиторием. Цель состоит в том, чтобы автоматически определить, какие свойства изменились по сравнению со значениями базы данных, а затем установить для этих измененных состояний свойств значение Изменено. В моей текущей реализации метод Modified не знает тип сущности, поэтому я не могу просто получить его с помощью context.Set<T>.Find(key)
.
Полагаю, я мог бы добавить перегрузку, которая принимает параметр originalEntity
, но я бы предпочел этого не делать, если это возможно.
void IDbContext.Modified<T>(T entity, T originalEntity)
{
DbEntityEntry<T> entry = Entry(entity);
if (entry.State == EntityState.Modified)
{
// if the state is already Modified we don't need to do anything else
return;
}
if (entry.State == EntityState.Detached)
{
Set<T>().Attach(entity);
entry.OriginalValues.SetValues(originalEntity);
}
}