C# EF6 使用 Unity 对一个上下文进行多次异步调用 - Asp.Net Web Api

Posted

技术标签:

【中文标题】C# EF6 使用 Unity 对一个上下文进行多次异步调用 - Asp.Net Web Api【英文标题】:C# EF6 make multiple async calls to one context using Unity - Asp.Net Web Api 【发布时间】:2017-12-22 02:27:30 【问题描述】:

我在访问我的 SPA 网站时收到以下错误,该网站在加载时会调用 API:

第二个操作在前一个上下文之前开始 异步操作完成。使用“等待”确保任何 异步操作在调用另一个方法之前已经完成 在这种情况下。不保证任何实例成员都是线程 安全。

如果我不使用相同的上下文并尝试更新值,则会收到以下错误,请参阅此问题:

Entity Framework 6 - Dependency Injection with Unity - Repository pattern - Add or Update exception for many to many relationship

无法定义两个对象之间的关系,因为 它们附加到不同的 ObjectContext 对象。

这意味着我不能使用此处建议的答案来使用多个上下文:

https://***.com/a/20635076/3850405

UnityConfig.cs:

container.RegisterType<DbContext>(new HierarchicalLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>();
container.RegisterType<IContactRepository, ContactRepository>();

我该如何解决这个问题?

【问题讨论】:

您好,请显示引发错误的代码。 @MihailStancescu 各种 API 调用,因为它们是异步的,所以可以是加载站点时调用的任何方法。架构见这个:***.com/questions/45030136/… 【参考方案1】:

使用来自Microsoft.Practices.Unity.MvcPerRequestLifetimeManager 解决了它。

container.RegisterType<DbContext>(new PerRequestLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>();
container.RegisterType<IContactRepository, ContactRepository>();

【讨论】:

以上是关于C# EF6 使用 Unity 对一个上下文进行多次异步调用 - Asp.Net Web Api的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MVC3 ASP.NET 4.5 和 EF6 基于实体属性注释对 TextBoxFor 进行舍入

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(63)-Excel导入和导出

EF6 无法将分离的实体附加到上下文

在 EF6 中,是不是可以使用每个调用结构的上下文跨服务调用执行事务?

EF6 - 在没有种子的情况下运行更新数据库命令

EF6基础系列(12)--- EF进行批量添加/删除