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