由于目前开发的项目使用云计算技术,客户端只进行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. .net工具

    程序名称 作者 说明 文件结构与元数据查看看 AssemblyView1.0   可以查看.net平台下exe,dll源代码的类结构,比如变量,属性,函数,事件的定义. Anakrino   源代码开 ...

  2. python,django安装

    环境:win7 64位 软件:python3.4.3,jdango1.8,PyDev,pymysql0.7 一:安装python 1.安装好python好后,配置环境变量,可以参考其它的博客,本博客只 ...

  3. svn 应该忽略的文件(visual studio)

    *.o *.lo .la ## .*.rej .rej .~ ~ .# .DS_Store thumbs.db Thumbs.db *.bak *.class *.exe *.dll *.mine * ...

  4. 如何将本地的jar包上传到maven本地仓库中

    首先需要将本地的jar包做mvn install到本地仓库中 mvn install:install-file -Dfile=D:\skyeye-ruleInfo\lib\lucene-querypa ...

  5. 原来scanf读入字符串还能这样..

    (本文针对于NOIP Day1 玩具迷题) (这是弱鸡写的)(字符串用char二维,本质一样的) 在NOIP成功AC了这道题,结果OJ上被string卡了时间,没办法只能用scanf了.....百度看 ...

  6. effectiveC++ 内存管理 学习笔记

    1.尽量使用初始化列表而不要再构造函数里赋值,初始化顺序和声明的顺序一致,一些类型如const,引用等,必须使用初始化.对于非内部数据类型成员对象应当采用初始化表,以获取更高的效率.example:B ...

  7. android 之httpclient方式提交数据

    HttpClient: 今天实战下httpclient请求网络json数据,解析json数据返回信息,显示在textview, 起因:学校查询饭卡余额,每次都要访问校园网(内网),才可以查询,然后才是 ...

  8. 利用DOS批处理实现定时关机操作

    10月1放假回来,寝室晚上10:30就停电了,最无法让人理解的是第二天早上8:00才来电.原来晚上电脑都是不关机的,开着WiFi一直到天亮,可是现在不行了,电脑如果一直开着第二天早上起来电脑肯定没电, ...

  9. socket编程学习step1

    socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768 sockets(套接字)编程有三种,流式套接字(SOCK_ST ...

  10. ELK+Kafka集群日志分析系统

    ELK+Kafka集群分析系统部署 因为是自己本地写好的word文档复制进来的.格式有些出入还望体谅.如有错误请回复.谢谢! 一. 系统介绍 2 二. 版本说明 3 三. 服务部署 3 1) JDK部 ...