Tengo una aplicación web con:
Realicé una actualización de .NET Framework de la versión 4.5.1 a 4.6.2 .
Desde entonces, el método "SaveChangesAsync ()" de "System.Data.Entity" ya no actualiza mi base de datos.
No puedo encontrar si es por el paquete .NET framework o por algunos problemas de compatibilidad entre Entity Framework 6.1.3 y .NET Framwork 4.6.2 para el método "SaveChangesAsync ()" ... ¡Estoy perdido!
Aquí hay algunas muestras:
Clase de servicio
public async Task<MyActionResponseModel> UpdateSomething(Catalogue catalogue)
{
if (catalogue== null) throw new ArgumentNullException("catalogue is null");
var response = new ActionAddResponse();
var catalogueToUpdate = await _catalogueRepository.GetCatalogueById(catalogue.Id);
var myDate = new DateTime();
if (catalogue.EndDate != null)
{
myDate = catalogue.EndDate.Value;
myDate = myDate.Date.AddHours(23).AddMinutes(59);
}
catalogueToUpdate.Year = catalogue.Year;
catalogueToUpdate.StartDate = catalogue.StartDate;
catalogueToUpdate.EndDate = catalogue.EndDate!= null ? myDate : catalogue.EndDate;
catalogueToUpdate.Tax = catalogue.Tax;
catalogueToUpdate.Online = Convert.ToBoolean(catalogue.Online);
catalogueToUpdate.RefNote = catalogue.RefNote;
await _unitOfWork.SaveAsync();
response.Success = true;
response.Message = string.Format("Catalogue has been update");
return response;
}
Clase UnitOfWork
public class UnitOfWork:IUnitOfWork
{
public async Task SaveAsync()
{
await _context.SaveChangesAsync(); // System.Data.Entity
}
}
paquete.config
<packages>
<package id="EntityFramework" version="6.1.3" targetFramework="net462" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.6" targetFramework="net451" />
<package id="Newtonsoft.Json" version="10.0.1" targetFramework="net451" />
</packages>
Ya revisé mi coreografía async / await y todo parece correcto. Entonces, ¿qué está pasando allí?
Gracias de antemano.
Finalmente encontré lo que estaba haciendo mal. De hecho estoy usando "Unidad" (verison 5.8.6). Realicé una actualización de mi paquete de Unity al mismo tiempo que .NET Framework la última vez.
Hice mi UnityConfig.cs así:
public static void ConfigureUnityContainer(IUnityContainer container)
{
// some other resgistration
container.RegisterType<MyEntities>(new PerResolveLifetimeManager());
}
El error está en el tipo del administrador. El correcto es PerRequestLifetimeManager
:
public static void ConfigureUnityContainer(IUnityContainer container)
{
// some other resgistration
container.RegisterType<MyEntities>(new PerRequestLifetimeManager());
}
Lo que entendí para PerRequestLifetimeManager
es que el contenedor resolverá la misma instancia del objeto en la solicitud http, mientras que PerResolveLifetimeManager
marcará el tipo para que las instancias se reutilicen en el gráfico de objetos de creación.
En resumen, con PerRequestLifetimeManager
, en diferentes solicitudes de http tendremos diferentes objetos resueltos.