【问题标题】:SaveChangesAsync() method not updating databaseSaveChangesAsync() 方法不更新数据库
【发布时间】:2018-06-08 14:11:45
【问题描述】:

我有一个 web 应用程序:

  • 实体框架6.1.3
  • 框架 .NET 4.5.1

我将 .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
    }
}

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

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

提前谢谢你。

【问题讨论】:

  • 这很大程度上取决于您为什么要通过// some works 评论隐藏。你能告诉我们更新实体的代码部分吗?
  • 尝试启用 EF 日志记录。您将能够看到正在生成的确切 SQL。
  • 我更新了我的代码示例
  • 确保GetCatalogueById 方法返回的实例使用与您的 UoW 相同的 DbContext。还要检查你没有在上面使用 AsNotTracking。

标签: c# .net entity-framework entity-framework-6


【解决方案1】:

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

我的 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请求中,我们会有不同的解析对象。

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多