Entity Framework 在 C# 中使用多线程(任务)导致问题
Entity Framework causing issue using Multithreading (Task) in C#
在我的 Asp.net MVC 3 应用程序中,使用 Entity Framework 6.0,我正在尝试使用异步方法更新数据库 table 记录:
public static async Task UpdateAssetLogAsync(string assetID)
{
using (var context = new MyContext())
{
var log = await context.UploadedLogs.SingleAsync(e => e.AssetID == assetID);
if (log != null)
{
log.LastUpdatedOn = DateTime.Now;
await context.SaveChangesAsync();
}
}
}
不幸的是,代码执行在第 5 行即停止,即
var log = await context.UploadedLogs.SingleAsync(e => e.AssetID == assetID);
Visual Studio (2012) 完全没有显示错误,程序执行只是从这里中断。
谁能告诉我这是什么问题?
[编辑] 这是我的连接字符串
<add name="MyContext" connectionString="Server=.\SQLExpress;Database=Test;Max Pool Size=80;Integrated Security=true;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>
[编辑] 发生这种情况是因为连接字符串中有 'Integrated Security=true'。如果我在连接字符串中使用 sa 和密码选项,它工作正常。在我的 web.config 中已经定义了一个模拟上下文,它在 Task 外部工作正常,但在 Task 内部似乎模拟上下文不可用,导致 EF 无法连接。
使用异步方法生成的线程通常 return 任务或 Task<TResult>
。不幸的是,默认情况下,调用者 的模拟上下文不会 传递给此线程。这可能就是您无法连接到数据库的原因 - 凭据错误。
您可以使用 IIS
中的 <alwaysFlowImpersonationPolicy>
通过 aspnet.config 文件设置传递模拟上下文
或
在您的代码中,使用 WindowsIdentity
和 WindowsImpersonationContext
允许模拟上下文与异步线程一起流动。
以下是一些感兴趣的文章:
http://blog.codeishard.net/2012/09/17/await-async-mvc-and-impersonation/
How do I set the user identity for tasks when calling Task.WaitAll()?
在我的 Asp.net MVC 3 应用程序中,使用 Entity Framework 6.0,我正在尝试使用异步方法更新数据库 table 记录:
public static async Task UpdateAssetLogAsync(string assetID)
{
using (var context = new MyContext())
{
var log = await context.UploadedLogs.SingleAsync(e => e.AssetID == assetID);
if (log != null)
{
log.LastUpdatedOn = DateTime.Now;
await context.SaveChangesAsync();
}
}
}
不幸的是,代码执行在第 5 行即停止,即
var log = await context.UploadedLogs.SingleAsync(e => e.AssetID == assetID);
Visual Studio (2012) 完全没有显示错误,程序执行只是从这里中断。
谁能告诉我这是什么问题?
[编辑] 这是我的连接字符串
<add name="MyContext" connectionString="Server=.\SQLExpress;Database=Test;Max Pool Size=80;Integrated Security=true;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>
[编辑] 发生这种情况是因为连接字符串中有 'Integrated Security=true'。如果我在连接字符串中使用 sa 和密码选项,它工作正常。在我的 web.config 中已经定义了一个模拟上下文,它在 Task 外部工作正常,但在 Task 内部似乎模拟上下文不可用,导致 EF 无法连接。
使用异步方法生成的线程通常 return 任务或 Task<TResult>
。不幸的是,默认情况下,调用者 的模拟上下文不会 传递给此线程。这可能就是您无法连接到数据库的原因 - 凭据错误。
您可以使用 IIS
中的<alwaysFlowImpersonationPolicy>
通过 aspnet.config 文件设置传递模拟上下文
或
在您的代码中,使用 WindowsIdentity
和 WindowsImpersonationContext
允许模拟上下文与异步线程一起流动。
以下是一些感兴趣的文章:
http://blog.codeishard.net/2012/09/17/await-async-mvc-and-impersonation/
How do I set the user identity for tasks when calling Task.WaitAll()?