В нескольких местах в моем коде я делаю массовые обновления с использованием удобных расширений денди Z.EntityFramework.Plus
, например,
await db.Foos
.Where(f => f.SomeCondition)
.UpdateAsync(f => new Foo { Field1 = "bar", Field2 = f.Field2 + 1 });
, которые обновят все Foo
записи, где SomeCondition
- true, настройка Field1
до "бара" и Field2
будут увеличены на единицу.
Теперь появилось новое требование, согласно которому некоторые таблицы (но не все) отслеживают ModifiedDate
.Это включает записи, где я делаю массовые обновления.
Так что мой подход такой.У меня есть интерфейс:
public interface ITrackModifiedDate
{
DateTime ModifiedDate { get; set; }
}
Так что все мои классы, которые отслеживают ModifiedDate
, могут реализовать ITrackModifiedDate
.Затем я пишу расширение среднего уровня для перехвата вызовов .UpdateAsync()
:
public static async Task<int> UpdateAsync<T>(this IQueryable<T> queryable, Expression<Func<T, T>> updateFactory)
where T : class
{
if (typeof(ITrackModifiedDate).IsAssignableFrom(typeof(T)))
{
// TODO Now what?
}
return await BatchUpdateExtensions.UpdateAsync(queryable, updateFactory);
}
Как видите, я не совсем уверен, как изменить updateFactory
для установки ModifiedDate
в DateTime.UtcNow
, поверх других полей, которые уже обновляются.
Как это сделать?
ОБНОВЛЕНИЕ: Я не против изменить свое расширение так, чтобыон принимает только T
типа ITrackModifiedDate
, если это помогает, то есть
public static async Task<int> UpdateAsync<T>(this IQueryable<T> queryable, Expression<Func<T, T>> updateFactory)
where T : class, ITrackModifiedDate
{
// TODO what now?
return await BatchUpdateExtensions.UpdateAsync(queryable, updateFactory);
}