• Web API+Entity Framework分享


    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.NETFrameworkv4.0.30319aspnet_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.NETFramework64v4.0.30319aspnet_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; }

    10、Linq to Entity

    linq to entity,当有空值时会报错,所以程序里边需要判断是否存在空值,如果存在null必须赋值,此代码赋值“”

    from a in db.RoleInfoes
    join b in db.UserInfoes
    on a.LastUpdateBy equals b.UserId into temp
    from tt in temp.DefaultIfEmpty()
    select new
    {
        a.RoleId,
        a.RoleName,
        FirstName = tt.FirstName ?? "",
        LastName = tt.LastName ?? "",
        a.RoleDescription,
        LastUpdate=a.LastUpdate.ToString()
    };

    11、因为 DbContext 继承自IDisposable 所以你需要释放资源在使用完dbcontext,如果使用了using就不用以下

    方法了.

    protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    db.Dispose();
                }
                base.Dispose(disposing);
            }

    12.API action可以针对多个实体采用一个Jobject类型的参数来接收对象,然后再分别在服务端取出,大家可以搜索Json.net的Jobject对象的使用.但是在实际angular调用服务端的过程中会发现,如果使用Get方法来调用Web API的get方法,传过来的JObject参数值是空的,此时可以使用Post的方式来传递,此时就会是有值的了.

    相关文章:

    13、 WebApi中如果某个action要不受具体actinFilterattribute限制(即不执行该attribute中的具体方法,在做权限控制的时候特别有用),可以给该action增加属性OverrideActionFilters,如下例:

           
     [OverrideActionFilters]
          public IHttpActionResult GetDataPoint()
    
         {
    
         } 

    14、 WEBAPI能否提供统一接口提供异常呢,避免异常描述满天飞,答案当然是有的,可以自定义异常属性类并继承ExceptionFilterAttribute,并覆写

    OnException 方法,然后就可以捕获各种异常了,如下代码

    public override void OnException(HttpActionExecutedContext actionExecutedContext)
            {
                //this exception is DbEntityValidationException
                if (actionExecutedContext.Exception is DbEntityValidationException)
                {
                    DbEntityValidationException validationException = actionExecutedContext.Exception as DbEntityValidationException;
                    StringBuilder sb = new StringBuilder();
                    foreach (DbEntityValidationResult item in validationException.EntityValidationErrors)
                    {
                        foreach(var itemerror in item.ValidationErrors)
                        {
                            sb.AppendLine(itemerror.ErrorMessage);
                        }
                    }
                    actionExecutedContext.Response=APIResponseMessage.Create(CommonMessage.Error, message: sb.ToString());
                }
                else
                {
                    actionExecutedContext.Response = APIResponseMessage.Create(CommonMessage.Error, message: actionExecutedContext.Exception.Message);
                }
            }

    那么什么时候会触发该WebApiExceptionFilterAttribute类中的OnException方法呢,答案就是如果你在action中如果不定义任何捕获异常的逻辑,当

    程序运行时出现异常会自动被该方法捕获,如果你在action中有用catch捕获了异常,那么并自行处理了,那么就不会触发该方法。当然,你如果有用 throw ex

    来抛出了异常,那么OnException也会捕获到该异常.
     相关参考链接大家可以参考一下文章:

    http://www.cnblogs.com/aehyok/p/3446863.html 

    http://blog.jobbole.com/99858/ 

     16、大家猜一下以下的结果会不会是一样的,其中db是DbContext,DataLensDataPoint是表对应model.

    db.DataLensDataPoint.Where(item => item.Name.Equals(dataPoint.Name,StringComparison.CurrentCultureIgnoreCase)) 
    
    db.DataLensDataPoint.Where(item=>item.Name.ToUpper()== dataPoint.Name.ToUpper())

    ,可能你会说一样,但是其实不一样,第一句中StringComparison.CurrentCultureIgnoreCase根本没起作用,也就是没有忽略大小写,但是第二句使用了ToUpper()确实忽略了大小写,不知道是否与DBA设置database为大小写敏感了有没有关系,还是这是一个bug呢?欢迎大家探讨.

     17、在对EF框架中的数据做tracking log的时候可以覆写SaveChangesAsync或者SaveChanges,当时要明白一点:db.DataLensDataPointAFS.Where(item => item.DataPointId == dataPoint.DataPointId).Delete()和

    await db.DataLensDataPointUniverseValidationCheck.Where(item => dataPointUniverseId.Contains(item.DataPointUniverseId)
    ).DeleteAsync();这样的方法数据的改变不会被SaveChangesAsync或者SaveChanges方法中捕捉到,因为这两个方法是Entity Framework的扩展类EntityFramework.Extended中的方法,本身有对数据库直接更改的能力,而不需要SaveChangesAsync或者SaveChanges.

     18、当在进行类型转换的时候,发现一个问题,当T时dynami类型时如果使用Type type = typeof(T)来获取类型之后,然后使用type.GetProperties()来获取属性,获取属性就会失效.这时候只能使用真实类型.

    restful标准描述

    http://www.cnblogs.com/artech/p/restful-web-api-02.html

    webapi分页

    微软Odata 技术
     
  • 相关阅读:
    docker 数据卷 ---- 进阶篇
    docker 数据卷 ---- 基础篇
    python做基本的图像处理
    conv1d UpSampling1D aotoencoder 自编码代码摘录
    python daal test
    python dict 构造函数性能比较
    CNN autoencoder 进行异常检测——TODO,使用keras进行测试
    利用CNN进行流量识别 本质上就是将流量视作一个图像
    Deep Belief Network简介——本质上是在做逐层无监督学习,每次学习一层网络结构再逐步加深网络
    python pipe stdout 实现cat|grep 功能
  • 原文地址:https://www.cnblogs.com/cby-love/p/5529497.html
Copyright © 2020-2023  润新知