实体框架 6、.NET Framework 4.0 和 SaveChangesAsync

Posted

技术标签:

【中文标题】实体框架 6、.NET Framework 4.0 和 SaveChangesAsync【英文标题】:Entity Framework 6, .NET Framework 4.0 and SaveChangesAsync 【发布时间】:2015-02-28 20:39:32 【问题描述】:

我正在VS2012 上开发,目标是.NET Framework 4.0 并使用EF6

我已经安装了来自 Microsoft 的 Nuget 包。

 <package id="Microsoft.Bcl" version="1.1.8" targetFramework="net40" />
 <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net40" />
 <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net40" />

我想异步保存对数据库的更改。 我发现有Await 可用,但我找不到SaveChangesAsync

我需要做什么才能使用 Framework 4.0 启用异步操作?

(我无法升级到 Framework 4.5,需要坚持使用 4.0)

【问题讨论】:

可能是他们编译出来的,所以它不可用。 【参考方案1】:

async 函数不包含在 .Net 4.0 编译的 EF 程序集中,因此您必须使用 Task 来调用 SaveChanges

摘自EF的源代码:

#if !NET40

        public virtual Task<int> SaveChangesAsync()
        ...

        public virtual Task<int> SaveChangesAsync(CancellationToken cancellationToken)
        ...

#endif

所以你可以创建一个这样的方法:

public Task<int> SaveChangesAsync(MyDbContext context)

    return Task.Factory.StartNew(() => context.SaveChanges());

我假设您知道 DbContext 不是线程安全的,因此您必须确保该上下文同时不用于其他数据库交互。

【讨论】:

在函数中放置什么以使保存更改异步发生?调用 SaveChanges() 还是同步接触数据库? 当然可以,但是任务之外的代码会继续运行,除非你明确地等待任务完成。 好的。只是为了确保最终函数应该是这样的?: public virtual Task SaveChangesAsync() _context.SaveChanges(); @user2143213 如果你想使用异步 IO,这将无法实现。 @GertArnold 可能是因为这是 async-over-sync 反模式。不过,这种模式在这里是合理的。

以上是关于实体框架 6、.NET Framework 4.0 和 SaveChangesAsync的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 是不是支持 .NET 4.0?

如何在 .net framework 4.0 中压缩文件夹

怎么让vs2008用.net framework4.0

.NET Framework 4.0 安装失败

.Net Framework 4.0 SDK

Win10系统无法安装.net framework 4.0怎么办