У меня проблемы с EF Core 3.1. с кодом, который работал до недавнего времени. У меня есть этот метод, который вызывается до того, как SaveChanges вызывается для DbContext:
private void SetProps<TEntity>(TEntity dbEntity, EntityState newState)
where TEntity : class, new()
{
var entry = this.dbContext.Entry(dbEntity);
...
if (dbEntity is IDbEntityBase dbEntityBase)
{
var baseEntry = this.dbContext.Entry(dbEntityBase);
if (newState == EntityState.Added)
{
baseEntry.Property(t => t.Id).CurrentValue = Guid.NewGuid();
}
}
}
Большая часть кода оставлена для более удобного чтения, поэтому любые изменения в дизайне будет трудно сделать.
У меня проблема в звонке на baseEntry.Property(t => t.Id).CurrentValue = Guid.NewGuid();
. Когда вызывается этот код, EF выдает исключение 'this' type cannot be an interface itself.
.
IDbEntity - это некоторый базовый интерфейс, который реализуют все классы сущностей (у него есть некоторые общие свойства).
Стек вызовов EF выглядит следующим образом this:
System.ArgumentException: 'this' type cannot be an interface itself.
at System.RuntimeTypeHandle.VerifyInterfaceIsImplemented(RuntimeTypeHandle interfaceHandle)
at System.RuntimeType.GetInterfaceMap(Type ifaceType)
at System.Reflection.RuntimeReflectionExtensions.GetRuntimeInterfaceMap(TypeInfo typeInfo, Type interfaceType)
at Microsoft.EntityFrameworkCore.Infrastructure.ExpressionExtensions.GetPropertyAccess(LambdaExpression propertyAccessExpression)
at Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry`1.Property[TProperty](Expression`1 propertyExpression)
at InDocEdge.Sap.Database.EfContext.SapDbContext.ProcessBeforeSaveChangesData() in C:\MyCode\MyDbContext.cs:line 2
at InDocEdge.Sap.Database.EfContext.SapDbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken) in C:\MyCode\MyDbContext.cs:line 1
Код работал до недавнего времени, но почему-то теперь EF недоволен (насколько я понимаю) тем, что я предоставляю тип интерфейса для метода Entry, что я считаю возможным.
Кто-нибудь знает, что может быть не так или как решить эту проблему?