首页 > 解决方案 > SaveChangesAsync() 方法不更新数据库

问题描述

我有一个 Web 应用程序:

我将 .NET Framework 从版本4.5.1升级到4.6.2

从那以后,“System.Data.Entity”方法的“SaveChangesAsync()”不再更新我的数据库。

我找不到是因为 .NET 框架包还是 Entity Framework 6.1.3 和 .NET Framwork 4.6.2 之间的“SaveChangesAsync()”方法的兼容性问题……我迷路了!

以下是一些示例:

服务等级

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;
}

UnitOfWork 类

public class UnitOfWork:IUnitOfWork
{    
    public async Task SaveAsync()
    {
        await _context.SaveChangesAsync(); // System.Data.Entity
    }
}

包配置

<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>

我已经检查了我的 async/await 编排,一切似乎都是正确的。那么那里发生了什么?

先感谢您。

标签: c#.netentity-frameworkentity-framework-6

解决方案


我终于发现我做错了什么。事实上,我正在使用“Unity”(版本 5.8.6)。上次我在更新 .NET Framework 的同时更新了我的 Unity 包。

我像这样制作了 UnityConfig.cs:

public static void ConfigureUnityContainer(IUnityContainer container)
{
    // some other resgistration
    container.RegisterType<MyEntities>(new PerResolveLifetimeManager());
}

错误在于经理的类型。正确的是PerRequestLifetimeManager

public static void ConfigureUnityContainer(IUnityContainer container)
{
    // some other resgistration
    container.RegisterType<MyEntities>(new PerRequestLifetimeManager());
}

我的理解PerRequestLifetimeManager是,容器将在 http 请求中解析对象的同一个实例,同时PerResolveLifetimeManager标记类型,以便在构建的对象图中重用实例。

总之,随着PerRequestLifetimeManager, 在不同的 http 请求中,我们将有不同的解析对象。


推荐阅读