EF6 NotMapped属性在请求范围之外反序列化

时间:2015-05-28 15:51:27

标签: c# entity-framework asp.net-web-api entity-framework-6

我的webapi应用程序设置为使用MessageHandler根据请求标头设置数据库连接来处理多个数据库连接。然后我在创建上下文时使用此连接实例。这部分效果很好。

但是,我在大多数需要上下文的实体上都有[NotMapped]属性,这样我就可以对db运行一个额外的查询(显然,实体来自同一个db)。

问题是,似乎webapi在意识到它具有未映射的属性之前完成了请求,然后返回管道以检索该属性。但是,在那时,我退出了我的消息处理程序,我的连接实例不再设置,当我尝试在属性getter中创建上下文时,我从连接实例获得NullRefException

这就是我在脑海中看到的: enter image description here

我的第一个想法是,必须有一种从实体获取上下文的方法。但是,在EF6中,all Entities are simply POCOs which have no knowledge of their context.(参见第一条评论)

我唯一想到的就是在每个实体中手动设置上下文的实例,以便我可以在NotMapped属性中引用它,但这看起来似乎是粗略的。< / p>

我是以错误的方式看待这个吗? 对解决方案的任何建议? (或者可能有关如何实际处理NotMapped属性的说明?)

编辑:进一步检查时,JSON序列化过程似乎抛出了错误。 (Newtonsoft.Json.JsonSerializationException)因此似乎在序列化期间评估返回的IQueryable,然后它尝试评估[NotMapped]属性,并因连接实例不再存在而失败。

我必须假设我想要完成的事情是可能的,我现在还不确定如何。 基本上我需要`[NotMapped]'属性来了解创建实体的上下文。 建议非常感谢!

1 个答案:

答案 0 :(得分:0)

我不认为这是最好的解决方案,但由于还没有人提出任何其他建议,我发布了迄今为止我提出的建议:

我最终做的是将一个connectionString变量添加到我的所有实体派生的pygame.display.update()类中。在BaseEntity 构造函数中,我在创建实体时将此属性设置为当前正在使用的连接字符串(此时在范围内)。

然后,只要稍后访问我的BaseEntity属性(用于反序列化或其他方式),我引用实体上的连接属性来创建我的上下文。

这样的事情:

[NotMapped]

到目前为止,这似乎工作得很好,我认为这将是我的解决方案。请随时建议任何备用/改进的解决方案。