[英]Web API with separate entity framework data layer
我有一个使用默认VS15模板和“ defaultconnection”连接字符串使用asp.net身份设置的Web API。 我在解决方案中添加了一个类库,并在该数据库中添加了一个实体框架ado.net模型。 我在类库的app.config文件中添加了一个连接字符串到我的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="data source=MyDatabase;initial catalog=Dev;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
为了进行测试,我试图从api的控制器获取用户信息的请求:
[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并从我的使用defaultconnection进行身份验证的API中引用它?
在Get
返回的值(.Net运行时空间中的User
对象)与API使用者端的接收值之间涉及大量中间件。 发生的第一件事是将User
对象序列化为Json。
尽管Json序列化器(Json.Net)是一个非常聪明的野兽,但它不知道加载和未加载的导航属性之间的区别。 因此,如果您的User
具有“ Accounts
类的属性(仅作为示例),它也会尝试序列化该属性。 这将触发延迟加载,从而引发此臭名昭著的异常。
一个快速的解决方法是禁用延迟加载:
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());
这样,您就可以完全控制通过网络发送的内容,并且不会出现延迟加载的意外情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.