繁体   English   中英

具有独立实体框架数据层的Web API

[英]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=&quot;data source=MyDatabase;initial catalog=Dev;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM