zoukankan      html  css  js  c++  java
  • 关于SubSonic3.0插件使用实体进行更新操作时(执行T.Update()或T.Save()),某些列无法进行修改操作的问题处理

      SubSonic3.0插件在创建实体后,对实体进行赋值操作时,为了去除一些不必要更新的字段,减少更新的内容,会将更新内容与默认值进行比较,如果默认值与当前更新的内容相等时,则不提交更新本列,这主要是为新增记录时设置的,因为本列虽然不进行更新,但由于数据库里存在默认值,所以提交后数据库会自动判断使用默认值进行填充。

      比如数据库有表Test,有字段StatusName nvrchar(10), StatusId int,默认值为0,正常新增记录语句为 insert into Test (StatusNam,  StatusId) values('名称', 0);  但由于StatusId有默认值,而提交的值同默认值相等的话,实际新增记录语句为insert into Test (StatusNam) values('名称'); 就可以了。

      而SubSonic3.0插件在做修改操作时,由于没有进行判断当前操作是新增还是修改操作,所以同新增记录操作一视同仁,直接将修改该状态值的操作给过滤了,这些列的值也就无法更新,具体修改如下:

      打开模版文件ActiveRecord.tt,找到下面代码

    <#=col.SysType #><#=CheckNullable(col)#> _<#=col.CleanName #>;
            public <#=col.SysType #><#=CheckNullable(col)#> <#=col.CleanName #>
            {
                get { return _<#=col.CleanName #>; }
                set
                {
                    if(_<#=col.CleanName #>!=value){
                        _<#=col.CleanName #>=value;
                        var col=tbl.Columns.SingleOrDefault(x=>x.Name=="<#=col.Name #>");
                        if(col!=null){
                            if(!_dirtyColumns.Any(x=>x.Name==col.Name) && _isLoaded){
                                _dirtyColumns.Add(col);
                            }
                        }
                        OnChanged();
                    }
                }
            }
    View Code

      将它修改为

    <#=col.SysType #><#=CheckNullable(col)#> _<#=col.CleanName #>;
            public <#=col.SysType #><#=CheckNullable(col)#> <#=col.CleanName #>
            {
                get { return _<#=col.CleanName #>; }
                set
                {
                    if(_<#=col.CleanName #>!=value || _isLoaded){
                        _<#=col.CleanName #>=value;
                        var col=tbl.Columns.SingleOrDefault(x=>x.Name=="<#=col.Name #>");
                        if(col!=null){
                            if(!_dirtyColumns.Any(x=>x.Name==col.Name) && _isLoaded){
                                _dirtyColumns.Add(col);
                            }
                        }
                        OnChanged();
                    }
                }
            }
    View Code

      修改后生成的代码就会改变为:

      

      将SubSonic3.0插件源码重新生成一下就可以正常使用了。

      本文章为原创内容,转载请保留下面信息。

      发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:SubSonic3.0学习群(327360708)或Email给我(1654937#qq.com),大家一起探讨,由于本人工作很繁忙,如果疑问请先留言,回复不及时也请谅解。

      想了解更多SubSonic3.0的相关问题,请观注博客:http://www.cnblogs.com/EmptyFS/

  • 相关阅读:
    mac 10.15.7 修改PATH
    oc 属性类型一般用法
    ubuntu解压zip文件名乱码
    telnet 退出
    docker 根据容器创建镜像
    mac android adb device 没有显示设备
    Yii2 查看所有的别名 alias
    Yii2 App Advanced 添加 .gitignore
    ubuntu 18.04 搜狗突然就提示乱码
    An error occured while deploying the file. This probably means that the app contains ARM native code and your Genymotion device cannot run ARM instructions. You should either build your native code to
  • 原文地址:https://www.cnblogs.com/EmptyFS/p/3264183.html
Copyright © 2011-2022 走看看