我正在使用breeze通过实体框架服务器访问数据 - 基本上是breeze的默认设置。在我的测试中,我得到以下运行时服务器错误:
System.InvalidCastException: Unable to cast object of type 'SLN.Controllers.Context' to type 'System.Data.Entity.DbContext'.
at Breeze.WebApi.EFContextProvider`1.get_Context()
这很奇怪,因为1)我的SLN.Controllers.Context类确实是System.Data.Entity.DbContext的子类,2)我没有在产品(非测试)环境中得到这个错误。
请注意,错误来自Breeze.WebApi.dll的EFContextProvider类,它提供了大部分服务器实现。 EFContextProvider类有一个通用参数,我作为SLN.Controllers.Context传递。 EFContextProvider实例必须实例化我的Context(因为我没有),然后它必须尝试将它强制转换为System.Data.Entity.DbContext。
这个演员怎么会失败?它如何在非测试中工作,但在测试中失败?
更新
根据请求,以下是我的代码中与运行时错误相关的部分。
public class Context : DbContext {...}
[BreezeController]
public class TruDBController : ApiController
{
private class ContextProvider : EFContextProvider<Context>
{
...
}
private readonly EFContextProvider<Context> _contextProvider = new ContextProvider();
private EFContextProvider<Context> Provider
{
get {return _contextProvider;}
}
[HttpGet]
public IQueryable<Models.Table1> Table1()
{
// error occurs on get of Context from Provider
return Provider.Context.Table1;
}
}
强制转换属于轻微的EFContextProvider类Context属性:
public T Context {
get {
if (_context == null) {
_context = CreateContext();
// Disable lazy loading and proxy creation as this messes up the data service.
if (typeof(ObjectContext).IsAssignableFrom(typeof(T))) {
var objCtx = (ObjectContext)(Object)_context;
objCtx.ContextOptions.LazyLoadingEnabled = false;
} else {
var dbCtx = (DbContext)(Object)_context; // HERE??
dbCtx.Configuration.ProxyCreationEnabled = false;
dbCtx.Configuration.LazyLoadingEnabled = false;
}
}
return _context;
}
}