在调试程序时,同事发现添加记录时,出现了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属性(请看下图),然后运行代码,没有报错,打开数据库发现表里已经成功添加了一条记录。