2016-11-11 47 views
0

我有一个Web API,它被设定与使用默认VS15模板和“defaultconnection”连接字符串asp.net身份。我在解决方案中添加了一个类库,并且在我的数据库中添加了一个实体框架ado.net模型。我在类库的app.config文件中添加了一个连接字符串到我的web配置中。在API的Web API具有独立的实体框架数据层

Web.config文件的连接字符串:

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=MyDatabase;Initial Catalog=Dev;Integrated Security=True" providerName="System.Data.SqlClient" /> 
    <add name="IBPC_DevEntities" connectionString="metadata=res://*/IBPCDataModel.csdl|res://*/IBPCDataModel.ssdl|res://*/IBPCDataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MyDatabase;initial catalog=Dev;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

对于测试我想从我的API的控制器做用户信息的GET请求:

[Authorize] 
public HttpResponseMessage Get(int id) 
{ 
    using (IBPC_DevEntities entity = new IBPC_DevEntities()) 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, 
      entity.User.FirstOrDefault(u => u.NDBHUserID == id)); 
    } 
} 

当我送Postman中的请求(使用授权令牌)它以一个InnerException响应,该异常指出“ObjectContext实例已被处置并且不能再用于需要连接的操作。”

如何使用数据库第一EF6在自己的项目,并从我的API,使用defaultconnection验证参考呢?

+0

我的猜测是您的使用迟缓装载,所以从使用阻断包裹上下文内返回时被设置前的延迟加载属性被取出。检查[这](http://stackoverflow.com/questions/18398356/how-to-solve-the-error-the-objectcontext-instance-has-been-disposed-and-can-no-l)。也许是这样。 –

+0

默认情况下,实体框架使用延迟加载,除非通过禁用它来指定。 – Greg

回答

0

在.Net运行时空间中的返回值Get - User对象与API消费者端的接收值之间涉及大量中间件。发生的第一件事情之一是将User对象序列化为Json。

虽然JSON序列(Json.Net)是一个非常聪明的野兽,它不知道装不装导航性能之间的差异。所以,如果你有UserAccounts一个属性(只是一个例子),它会尝试序列化属性太。这会触发延迟加载,导致这个臭名昭着的异常。

一个快速的解决办法是禁用延迟加载:

using (IBPC_DevEntities entity = new IBPC_DevEntities()) 
{ 
    entity.Configuration.LazyLoadingEnabled = false; 
    return Request.CreateResponse(HttpStatusCode.OK, 
     entity.User.FirstOrDefault(u => u.NDBHUserID == id)); 
} 

一个更好的解决办法是使用视图模型/ DTO对象:

return Request.CreateResponse(HttpStatusCode.OK, 
     entity.User.Where(u => u.NDBHUserID == id) 
       .Select(u => new UserDto { Name = u.Name, .... }) 
       .FirstOrDefault()); 

然后你有过什么样将被发送完全控制通过网络,没有延迟加载意外将发生。

+0

非常感谢你的解释,我继续并定义了一个DTO,它的工作很棒。 –