webapi+entityframework工作问题总结
Posted 随遇而安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webapi+entityframework工作问题总结相关的知识,希望对你有一定的参考价值。
1、 webapi允许跨域的增删改查要在web.config中加入以下文字
<system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <remove name="OPTIONSVerbHandler" /> <remove name="TRACEVerbHandler" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> </customHeaders> </httpProtocol> </system.webServer>
2、webapi支持特性路由,即在action上可以加上类似 [Route("RoleRights/{id}")]的特性路由,前提条件是要支持特性路由,即在WebApiConfig.cs的register的方法中添加MapHttpAttributeRoutes().这样访问该action的时候就会无视路由表中的路由,访问该路由的正确格式为:网站名称/RoleRights/9.--9表示id。
3、ModelState.IsValid,该属性可以判断当客户端传送实体字段格式不正确时会显示为false.比如action中有参数实体A,A中b字段是整形,你传实体调用action,b你传了个“”,此时该属性值回味false.
4、注意添加webapi时生成的return BadRequest和return Notfound(),返回给web客户端时是做为异常处理的,即调用失败,如果使用jquery会调用error函数。返回的错误也比较明确.省去了自定义格式.
5、有时候我们只是对数据库中的某条已有记录做修改,那可以针对要修改的字段设置如下:
db.FunctionInfoes.Attach(functionInfoNew);
db.Entry(functionInfoNew).Property(x => x.FunctionName).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.FunctionType).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.ParentId).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.FunctionPath).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.Description).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.LastUpdateBy).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.LastUpdate).IsModified = true;
try
{
db.SaveChanges();
}
其中ismodified=true表示做save的时候要修改此字段.修改ismodufied之前一定要记得增加db.FunctionInfoes.Attach(functionInfoNew);否则会报错.
6、注意db.FunctionInfoes.RemoveRange(childEntityInfo);和 db.FunctionInfoes.Where(item => item.OwnerId == id).Delete();
的区别,前者不会影响到数据库记录,除非增加db.SaveChanges(),后者的修改直接回影响到数据库记录而不需要做db.SaveChanges().
7、记得每个control要增加一个Options空方法,否则做删除回提示not allowe this method。
public string Options()
{
return null; // HTTP 200 response with empty body
}
8、事务包裹是使用using(var dbContextTransaction = db.Database.BeginTransaction())
{....
....}
经查询对于一个context的 db.SaveChanges(),其实已经放在一个事务里边了,具体的可以通过sql profile去跟踪,对于分布式context的可能就要使用scope了.
9、使用entity framework table first的好处就是可对于数据库字段的更改,通过在edmx上右键Update model from database及时更新到程序model上.
对于实体序列化返回的属性,可以使用工具Newtonsoft.Json,自定义返回的名称。比如说实体A中有属性
public string Title { get; set; },,但是渴望序列化后返回的属性名是小写的,那么可以在该属性上加上特性[JsonProperty("title")],即
[JsonProperty("title")]
public string Title { get; set; }
以上是关于webapi+entityframework工作问题总结的主要内容,如果未能解决你的问题,请参考以下文章
实体框架 + Web API,在 DbContext 之外返回实体(复杂、集合等)
System.AccessViolationException WebAPI2 实体框架 6
使用 Asp.Net WebApi + EF + Odata 深度插入数据
将 ODATA $expand 查询选项与 WebAPI 和 ViewModel 一起使用