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

实体框架6、.NET框架4.0和SaveChangesAsync,.net,visual-studio-2012,asynchronous,entity-framework-6,.net,Visual Studio 2012,Asynchronous,Entity Framework 6,我正在开发VS2012,目标是.netframework4.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="Micro

我正在开发
VS2012
,目标是
.netframework4.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" />

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

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


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

异步
函数不包括在.Net 4.0编译的EF程序集中,因此您必须使用调用
保存更改的
任务

摘自EF的源代码:

#if !NET40

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

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

#endif
#如果!网络40
公共虚拟任务saveChangesSync()
...
公共虚拟任务保存更改同步(CancellationToken CancellationToken)
...
#恩迪夫
所以你可以创建一个像这样的方法:

public Task<int> SaveChangesAsync(MyDbContext context)
{
    return Task.Factory.StartNew(() => context.SaveChanges());
}
public Task savechangessync(MyDbContext)
{
返回Task.Factory.StartNew(()=>context.SaveChanges());
}

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

很可能是他们编译出来的,因此它不可用。在函数中放置什么来异步保存更改?调用SaveChanges()仍然同步地接触数据库?当然,但是任务之外的代码会继续运行,除非您显式地等待任务完成。Ok。为了确保这一点,最后一个函数应该是这样的?:public virtual Task savechangessync(){u context.SaveChanges();}@user2143213如果您想使用异步IO,这将无法实现该目标。@GertArnold可能是因为这是异步过同步反模式。不过,这种模式在这里是合理的。