我有一些独特的数据库结构,但我认为我试图做的查询并不是太平凡。
基本上,我创建了一个新记录。然后,我保存此记录,然后更新一些XML,然后使用新的XML更新记录。我遇到的问题是第二次保存没有做任何事情。
var applicant = new Applicant();
applicant.XmlData = "";
applicant.Save(); //save once and initiate the record
data.RecordRID = applicant.ApplicantRID;
applicant.XmlData = data.SerializeToXml();
var c=applicant.GetDirtyColumns().Count; //this returns a count of 0
applicant.Save(); //save twice to populate RecordRID
另外,作为参考,生成的XmlData
属性如下所示:
public string XmlData
{
get { return _XmlData; }
set
{
if(_XmlData!=value){
_XmlData=value;
var col=tbl.Columns.SingleOrDefault(x=>x.Name=="XmlData");
if(col!=null){
if(!_dirtyColumns.Any(x=>x.Name==col.Name) && _isLoaded){ //_isLoaded is never set to true for either saves
_dirtyColumns.Add(col);
}
}
OnChanged();
}
}
}
那么..有什么问题?我是否需要运行查询并从数据库中获取对象然后更新它?还是我错过了什么?
注意:我必须保存两次,因为ApplicantRID是唯一的主键。所以我必须先插入一条记录才能知道它是什么
答案 0 :(得分:0)
我最终修改了SubSonic的T4模板来解决这个问题。
在函数void Add(IDataProvider)
下的第466行的ActiveRecord.tt中:
var key=KeyValue();
if(key==null){
var newKey=_repo.Add(this,provider);
this.SetKeyValue(newKey);
}else{
_repo.Add(this,provider);
}
SetIsNew(false);
SetIsLoaded(true); //Added this line
OnSaved();
我没有注意到这种变化带来的任何奇怪之处,它似乎是一个它本来就不存在的错误。