关于SubSonic3.0查询或更新时出现System.NullReferenceException异常的处理
在调试程序时,同事发现添加记录时,出现了System.NullReferenceException异常
DictBase dict = new DictBase();
dict.DictCode = "aaa";
dict.DictName = "bbb";
dict.Save();
而自己在编写查询Information info = new Information(x => x.Id == 1); 时,也引发了同样的异常,经Debug发现,问题出现在SubSonic.Schema.DatabaseTable类的函数
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
发现PropertyName属性为null而引起的空指针异常,心想是不是因为没有捕捉到异常而引起的,就将函数修改为下面代码:
public IColumn GetColumnByPropertyName(string PropertyName)
{
try
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
catch (Exception) { }
return null;
}
改完后发现这个位置没问题了,但却引发了另外一个异常(Need to specify Values or a Select query to insert - can't go on!),意思是说插入的语句没有具体的值,然后通过Debug追踪,原来是加了异常捕捉后,返回的内容都为null了,没有运行到SQL执行语句值的添加操作,即SubSonic.Extensions.Database类的ToInsertQuery函数在执行前面函数返回值时为null时,query.Value(col.QualifiedName, hashed[key], col.DataType);这段语句没有执行到导致出错,就是说PropertyName一直都没有赋到值引起的null异常并没有找到根源,所以又从头开始Debug,一步步跟踪到Structs1.cs这个由模版生成的类里,发现在生成数据库表对应的架构一直到最后使用,并没有对PropertyName属性进行赋值。所以打开Structs.tt这个模版文件,将数据字段结构生成那里做了下面的修改,添加了PropertyName属性(请看下图),然后运行代码,没有报错,打开数据库发现表里已经成功添加了一条记录。
本文章为原创内容,转载请保留下面信息。
发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:SubSonic3.0学习群(327360708)或Email给我(1654937#qq.com),大家一起探讨,由于本人工作很繁忙,如果疑问请先留言,回复不及时也请谅解。
想了解更多SubSonic3.0的相关问题,请观注博客:http://www.cnblogs.com/EmptyFS/