关于SubSonic3.0插件使用实体进行更新操作时(执行T.Update()或T.Save()),某些列无法进行修改操作的问题处理_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 关于SubSonic3.0插件使用实体进行更新操作时(执行T.Update()或T.Save()),某些列无法进行修改操作的问题处理

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

 2013/8/18 19:28:28  AllEmpty  博客园  我要评论(0)
  • 摘要:SubSonic3.0插件在创建实体后,对实体进行赋值操作时,为了去除一些不必要更新的字段,减少更新的内容,会将更新内容与默认值进行比较,如果默认值与当前更新的内容相等时,则不提交更新本列,这主要是为新增记录时设置的,因为本列虽然不进行更新,但由于数据库里存在默认值,所以提交后数据库会自动判断使用默认值进行填充。比如数据库有表Test,有字段StatusNamenvrchar(10),StatusIdint,默认值为0,正常新增记录语句为insertintoTest(StatusNam
  • 标签:使用 插件 问题 执行 操作

  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,找到下面代码

class="code_img_closed" src="/Upload/Images/2013081819/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('5e5e0eae-aa1e-4ab0-bff2-c6819e302fe2',event)" src="/Upload/Images/2013081819/2B1B950FA3DF188F.gif" alt="" />
<#=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/

 

发表评论
用户名: 匿名