C# EF6 NotMapped属性在请求范围外反序列化
我的webapi应用程序设置为处理多个数据库连接,方法是使用C# EF6 NotMapped属性在请求范围外反序列化,c#,entity-framework,asp.net-web-api,entity-framework-6,C#,Entity Framework,Asp.net Web Api,Entity Framework 6,我的webapi应用程序设置为处理多个数据库连接,方法是使用MessageHandler根据请求头设置数据库连接。然后我在创建上下文时使用这个连接实例。这部分很好用 但是,我在大多数实体上都有一个[NotMapped]属性,它需要一个上下文,这样我就可以对数据库(显然,该实体来自同一个数据库)运行额外的查询 问题是,webapi似乎在意识到它有一个未映射的属性之前完成了请求,然后潜入管道以检索该属性。但是,此时,我已退出消息处理程序,不再设置连接实例,当我尝试在属性getter中创建上下文时,我
MessageHandler
根据请求头设置数据库连接。然后我在创建上下文时使用这个连接实例。这部分很好用
但是,我在大多数实体上都有一个[NotMapped]
属性,它需要一个上下文,这样我就可以对数据库(显然,该实体来自同一个数据库)运行额外的查询
问题是,webapi似乎在意识到它有一个未映射的属性之前完成了请求,然后潜入管道以检索该属性。但是,此时,我已退出消息处理程序,不再设置连接实例,当我尝试在属性getter中创建上下文时,我从连接实例中获得一个NullRefException
这是我在脑海中看到的:
我的第一个想法是,必须有一种从实体获取上下文的方法。然而,在EF6中,(见第一条注释)
我能想到要做的唯一一件事就是在每个实体中手动设置上下文的实例,这样我就可以在NotMapped
属性中引用它,但这看起来很粗略
我看得不对吗?有什么解决方案的建议吗?(或者可能澄清如何实际处理
NotMapped
属性?)
编辑:进一步检查后,该错误似乎是由JSON序列化进程引发的。(
Newtonsoft.Json.JsonSerializationException
)因此,似乎在序列化期间对返回的IQueryable进行了评估,然后它尝试评估[NotMapped]
属性,但由于连接实例不再存在而失败
我必须假设我正在努力完成的事情是可能的,我只是不知道现在该怎么做基本上,我需要“[NotMapped]”属性来了解创建实体的上下文。
非常感谢您的建议 我并不认为这是最好的解决方案,但由于还没有人提出任何其他建议,我将发布我迄今为止的想法: 我最后做的是向我的
BaseEntity
类添加一个connectionString变量,我的所有实体都从该类派生。在BaseEntity
构造函数中,我将此属性设置为创建实体时正在使用的当前连接字符串(此时在范围内)
然后,无论何时以后访问我的[NotMapped]
属性(用于反序列化或其他),我都会引用实体上的connection属性来创建上下文
大概是这样的:
public class BaseEntity
{
public BaseEntity()
{
// Save current connection string being used to create the entity.
// ConnectionManager.Instance.CurrentConnection will be null by the time deserialization happens
_connectionString = ConnectionManager.Instance.CurrentConnection.ConnectionString;
}
private readonly string _connectionString;
[NotMapped]
public string MyProperty
{
using (var ctx = new MyContext(_connectionString))
...
}
}
到目前为止,这似乎效果很好,我认为这将是我的解决方案。请随时提出任何替代/改进的解决方案。让我看看我是否理解。您正在尝试在POCO中手动实现延迟加载?你意识到你忽略了UoW的要点吗?@JoãoSimões我不是手动实现延迟加载,我使用的是带有WebAPI的Breeze,默认情况下会返回IQueryable。我尝试使用IQueryables(延迟加载),以便OData继续工作。但是,我需要为每个实体加载一些额外的数据,但是在计算IQueryable时,我的上下文丢失了。我目前的解决方案(请参阅答案)是自动保存一点我需要重新创建相同上下文的信息(在多连接环境中),以便在计算IQueryable时,它知道从何处加载附加数据。