【问题标题】:Enum stored correctly in DB but not being deserialized into type correctly in C#枚举正确存储在 DB 中,但未在 C# 中正确反序列化为类型
【发布时间】:2017-09-17 15:01:48
【问题描述】:

我有一个枚举:

public enum EnumSample{
    Setup = 1,
    Pending = 7
}

我有一个实体(我正在使用 EF)存储在数据库中,其 EnumSample 属性设置为 EnumSample.Pending。当我查询时,数据库将此值反映为7。但是,当我从 C# 中检索相同的实体(使用 EF)时,我得到了一个不正确的类型映射(我得到了Setup,而我应该得到Pending)。所有 ID 都经过验证。截图如下。这可能是什么原因造成的?

更新

重新启动应用程序让我得到了我的期望 - 问题是 dbContext 的实例在请求之间停留。我可以做using var db = new AppContext,它工作正常。

我在UnityContainer 上配置了以下内容:

   container.RegisterType<AppContext>(new ContainerControlledLifetimeManager());

我尝试了各种不同的生命周期管理器 - PerHttpRequestLifetimeManager 无法根据我看到的其他指导解决问题。

服务层方法示例:

   public class EventService : BaseService
   {

    public readonly AppContext _db;

    private readonly NotificationService _notificationService;

    public EventService(AppContext db, NotificationService notificationService)
    {
        _db = db;
        _notificationService = notificationService;
    }

我需要的行为是 EventService 和 NotificationService 具有相同的 AppContext 实例,但是在请求之间,上下文被释放并且我得到新的状态/新实例。

【问题讨论】:

  • 您是否可以使用分析器或扩展事件来查看实体框架生成的查询实际上是什么样的?然后我们可以使用它来验证它是否产生与您用于检查数据库的结果相同的结果。
  • 你是先使用代码吗?
  • @vendettamit 我是。我发现如果我重新启动应用程序,我会得到我所期望的。我相信这与陈旧的 dbContext 有关...
  • 你确定不只是自己设置属性吗?在setter上加断点
  • 好的,去吧!!如果我不是,那么肯定会有人对其进行审查。

标签: c# asp.net entity-framework enums ef-code-first


【解决方案1】:

PerThreadLifetimeManager 不保证每个请求将由不同的线程提供服务。默认情况下,Unity 没有每个请求的生命周期管理器。你需要安装一个 nuget 包 Unity.MVC,它有一个新的内置生命周期管理器:PerRequestLifetimeManager。

@SB2055 请参阅this answer 了解更多详情。

【讨论】:

  • 就是这样。你太棒了——感谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多