Написать переводимые методы расширения для использования внутри вызовов .ExecuteUpdate() EF Core?C#

Место общения программистов C#
Anonymous
Написать переводимые методы расширения для использования внутри вызовов .ExecuteUpdate() EF Core?

Сообщение Anonymous »

У меня есть несколько сущностей, которые наследуются от класса аудита: AuditableEntity:

Код: Выделить всё

public class AuditableEntity
{
public DateTime? LateUpdated { get; set;}
}

...

public class Foo : AuditableEntity // An entity
{
public int Id { get; set; }
public string Bar { get; set; }
}

public class Bar : AuditableEntity // Another entity
{
public int Id { get; set; }
public string Baz { get; set; }
}
В моей кодовой базе я хотел бы использовать метод .ExecuteUpdate() EF Core для обновления свойств моей сущности, включая то, которое она унаследовала от AuditableEntity. Один из способов добиться этого:

Код: Выделить всё

public class SomeService
{
private readonly IMyDbContext _dbContext;

public SomeService(IMyDbContext dbContext)
{
_dbContext = dbContext;
}

...

public void SomeMethod(){
{
...

_dbContext.Foo
.Where(x => x.Bar == "Hello")
.ExecuteUpdate(setter => setter
.SetProperty(x => x.Bar, x => "Goodbye")
.SetProperty(x => x.LastUpdated, x => DateTime.UtcNow));
...
}
}
Это работает. Однако я хочу создать метод расширения для автоматического обновления свойства LastUpdated. Вот что у меня получилось:

Код: Выделить всё

public static class SetPropertyCallsExtensions
{
public static SetPropertyCalls SetUpdateAuditableEntityProperties(this SetPropertyCalls setter, DateTime now)
where TSource : AuditableEntity
{
return setter.SetProperty(x => x.LastUpdated, v => now);
}
}
Тогда я называю это так:

Код: Выделить всё

public class SomeService
{
private readonly IMyDbContext _dbContext;

public SomeService(IMyDbContext dbContext)
{
_dbContext = dbContext;
}

...

public void SomeMethod(){
{
...

_dbContext.Foo
.Where(x => x.Bar == "Hello")
.ExecuteUpdate(setter => setter
.SetProperty(x => x.Bar, x => "Goodbye")
.SetUpdateAuditableEntityProperties(DateTime.UtcNow);
...
}
}
Однако у меня есть следующее исключение:

Код: Выделить всё

System.InvalidOperationException: The LINQ expression 'DbSet()
.Where(x => x.Bar == "Hello")
.ExecuteUpdate(setter => setter
.SetUpdateAuditableEntityProperties(
now: DateTime.UtcNow))' could not be translated. Additional information: The 'setPropertyCalls' argument to 'ExecuteUpdate' may only contain a chain of 'SetProperty' expressing the properties to be updated.  See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.Translate(Expression expression)
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.Translate(Expression expression)
at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.c__DisplayClass12_0`1.b__0()
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.ExecuteUpdateAsync[TSource](IQueryable`1 source, Expression`1 setPropertyCalls, CancellationToken cancellationToken)
Кто-нибудь знает, как написать этот метод расширения таким образом, чтобы его можно было транслировать с помощью EF Core? Или у вас есть предложение упростить обновление свойств AuditableEntity внутри вызовов .ExecuteUpdate()?

Подробнее здесь: https://stackoverflow.com/questions/791 ... cuteupdate

Вернуться в «C#»