在我的代码中的几个地方,我正在使用方便的花花公子Z.EntityFramework.Plus
扩展进行批量更新,例如
await db.Foos
.Where(f => f.SomeCondition)
.UpdateAsync(f => new Foo { Field1 = "bar", Field2 = f.Field2 + 1 });
这将更新所有Foo
记录SomeCondition
为真,设置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
set 。ModifiedDate
DateTime.UtcNow
怎么做?
更新:我不反对更改我的扩展名,以便它只接受T
type 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);
}