由于目前开发的项目使用云计算技术,客户端只进行UI与相关事件的功能开发,而所有的计算与处理都放到了服务器端,客户端与数据库没有任何关联,所以服务器端与客户端使用我们自己开发的通讯加密方式进行,而具体的数据内容传输就转成Json方式。客户端对数据进行添加与修改操作时,先将内容存储到实体中,然后转换成Json字串进行压缩加密处理后提交到服务器端,服务器端接收到后进行解压解密处理后,对Json字串进行反序列化处理存储到对应的实体当中,然后再进行相应的操作。

  在开发框架时还没有什么问题,而进行具体的功能开发时,发现进行添加是没有问题,但编辑时还是执行添加操作,并没有执行编辑操作。经过半天的DeBug跟踪,才发现原来SubSonic3.0只有查询出来的实体才能更新,比如使用构造函数查询的实体new Operator(x => x.Id == 10), 或者是DataModel.Operator.SingleOrDefault(x => x.Id < 10)等,而使用Json反序列化转实体进行更新时,并没有触发IsNew()和IsLoaded()这两个更新标识,所以在执行更新操作时(如var model = (DataModel.Operator)JsonConvert.DeserializeObject("", typeof(DataModel.Operator));),this._dirtyColumns.Count的值一直为0(这里存储的是将要进行更新的字段),插件检查上面标识后就默认为添加操作了。具体修改如下:

  打开ActiveRecord.tt模版,找到构造函数 public <#=tbl.ClassName#>() ,将它修改成下面内容:

    public <#=tbl.ClassName#>(){
//使用Json直接转换实体时,由于未激活更新功能,会导致只能添加不能更新,所以必须设置下面值,
//设置后Json转换的实体和实体中不包含的字段(字段类型为字符串的字段,数值型的不会提交),全部都会提交到数据库中
   //比如某些值在后台操作时并不需要提交的(如登陆IP),在实体中没有进行赋值,这时就会默认为""将数据库中的其他值给覆盖了 SetIsLoaded(true); _db=new <#=Namespace#>.<#=DatabaseName#>DB();
Init();
}

  模版构造函数修改后图例:

   

  模版修改后生成的代码图例:

  

  修改后重新生成插件就可以进行编辑操作了,不过这样改了后,会产生新的问题,由于开启了全部更新功能,会将一些不该更新的字段也给更新覆盖了,所以还须做下面的相关修改:

  在模版中找到public void Update(IDataProvider provider)函数,将它修改成下面内容:

    public void Update(IDataProvider provider){

<#if(tbl.Columns.Any(x=>x.Name=="ModifiedBy")){#>
if(String.IsNullOrEmpty(this.ModifiedBy))
this.ModifiedBy=Environment.UserName;
<#}#>
<#if(tbl.Columns.Any(x=>x.Name=="ModifiedOn")){#>
this.ModifiedOn=<#=DatabaseName#>DB.DateTimeNowTruncatedDownToSecond();
<#}#> if(this._dirtyColumns.Count>){
//如果存在过滤字段
if (_columns.Count > ) {
//定义装载过滤字段的IColumn容器
IList<IColumn> list = new List<IColumn>();
//遍历过滤字段容器
for (int i = ; i < _columns.Count; i++) {
//遍历将要进行更新操作的列
for (int j = ; j < this._dirtyColumns.Count; j++) {
//如果该列名存在过滤表中,即不需要进行更新操作
if (_columns[i] == this.Columns[j].Name) {
//将它装载进IColumn容器中,待后面进行操作
list.Add(this.Columns[j]);
}
}
}
//判断IColumn容器是否装载了内容
if (list.Count > )
{
//遍历容器
for (int i = ; i < list.Count; i++)
{
//将需要过滤的字段从更新列中移除
this._dirtyColumns.Remove(list[i]);
} }
} _repo.Update(this,provider);
_dirtyColumns.Clear();
}
OnSaved();
} /// <summary>定义不进行更新操作的字段的容器</summary>
private List<string> _columns = new List<string>();
/// <summary>
/// 添加将要过滤的字段
/// </summary>
/// <param name="columnName">字段名称</param>
public void AddFilterColumns(string columnName)
{
_columns.Add(columnName);
}

  模版构造函数修改后图例:

  

  模版修改后生成的代码图例:

  

  修改后将插件重新生成就可以调用了,请看下面的调用例子:

  

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

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

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

关于SubSonic3.0插件使用Json反序列化获得的实体进行更新操作时,只能执行添加而不能执行修改(编辑)操作的处理的更多相关文章

  1. 关于SubSonic3.0插件使用SqlQuery或Select查询时产生的System.NullReferenceException异常修复

    早上在编写执行用例时,突然爆异常System.NullReferenceException: 未将对象引用设置到对象的实例 执行代码:

  2. 关于SubSonic3.0插件更新字符串过长引发的System.Data.SqlClient.SqlException的异常修复

    最近公司客服提交了个BUG,说是更新产品详细信息时,有的可以有的更新不了,前段时间一直没空所以暂时放下,刚才又出现这个问题,所以马上处理了一下. 打开项目解决方案,进入DEBUG模式,拿到操作的数据提 ...

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

    SubSonic3.0插件在创建实体后,对实体进行赋值操作时,为了去除一些不必要更新的字段,减少更新的内容,会将更新内容与默认值进行比较,如果默认值与当前更新的内容相等时,则不提交更新本列,这主要是为 ...

  4. 关于SubSonic3.0插件使用SubSonic.Query.Select查询时,字段类型为tinyint时列丢失问题的Bug修复

    下午在写代码时,突然发现一个列名为Enable的字段怎么也查询不出来,开始以为可能这个名称是关键字,所以给过滤掉了,所以就将名称修改为IsEnable,问题还是一样......将名称又改为IsEnab ...

  5. 从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)

    前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一 ...

  6. SubSonic3.0插件分页查询速度测试

    使用SubSonic3.0一段时间了,一直都想找机会测试一下各种查询分页速度,对比一下插件的查询效率到底怎么样,所以昨天写好了测试程序,准备好1K.1W.10W.50W和100W记录的数据表,早上详细 ...

  7. SubSonic3.0.0.4.3源码包与调用Dll

    版本修改历史 3.0.0.4.3版修复了下面问题: 修正多表关联查询时,使用左关联和右关联出错问题修正DbDataProvider.cs类的ToEnumerable函数打开数据库链接后没有关闭的问题添 ...

  8. SubSonic3.0.0.4.2源码包与调用Dll

    ================================================================ 名    称:SubSonic插件版    本:3.0.0.4.2最后 ...

  9. SubSonic3.0.0.4.1源码包与调用Dll

    ================================================================ 名    称:SubSonic插件版    本:3.0.0.4.1最后 ...

随机推荐

  1. CUDA开发时用到的各种Linux命令

    cat 读取文件中的全部内容. 例:cat cuda_add.cu

  2. 2 安装redis.md

    cnblogs-DOC 1.服务器环境 2.安装Redis3.安装Zookeeper4.安装MPush5.安装Alloc服务6.完整测试7.常见问题 一.Linux系统安装Redis 官网下载Redi ...

  3. flume原理

    1. flume简介 flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original generat ...

  4. vue文件中引入外部js

    1.在项目的入口文件中(app.js)定义remoteScript标签 Vue.component('remote-script', { render: function (createElement ...

  5. react的dva框架初试

    使用背景:迫不得已!!(自己入职是以vue技术入职的,说是马上vue项目就来了,让我负责这个项目的前端.但是入职后就让我下了现在这个项目看下,然后就顺理成章的帮忙进行开发了,其实自己一直想要做reac ...

  6. MinGW安装教程( MinGW - Minimalist GNU for Windows)

    首先说明一下 1) MinGw只是其中一种GCC编译环境的安装程序,还有像Cygwin也是差不多的; 2) 还要就是安装MinGw,最好在一个网络比较好的环境中进行,  (有可能导致后来安装其他软件像 ...

  7. Oracle更换字符集

    现有数据库使用字符集是GBK,做读写分离的时候,发现读库的数据库安装错误,使用了UTF8的字符集 需要把读库的字符集进行调整. 1.进入PLSQL查看下数据库字符集 select * from nls ...

  8. SICP读书笔记 2.1

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  9. C++ auto_ptr智能指针的用法

    C++中指针申请和释放内存通常采用的方式是new和delete.然而标准C++中还有一个强大的模版类就是auto_ptr,它可以在你不用的时候自动帮你释放内存.下面简单说一下用法. 用法一: std: ...

  10. Use formatter to format your JAVA code

    In order to make the codes looks unified and make it easy to understand, it's better to use the same ...