问题: 我们数据库中的所有表都有CreatedDate,CreatedBy,ChangedDate,ChangedBy字段,我希望在保存/更新ActiveRecord实体时自动设置这些字段。
我的第一次尝试是覆盖Save()和Update()方法。但是,当我在实体上执行直接Save()或Update()时,只会调用这些方法。它们不是在Master - Detail场景中调用的,我只在master上调用Save()。
接下来尝试的是OnSave()和OnUpdate()方法,但这些字段中的更改未在数据库中保留。
最后我尝试了BeforeSave()方法。但更新时不会调用此方法。
问题: 如何在Save()或Update()期间自动设置这些CreatedDate,CreatedBy,ChangedDate,ChangedBy字段?
答案 0 :(得分:2)
要按照您的意愿修改数据,您必须覆盖BeforeSave方法,如下所示:
protected override bool BeforeSave(IDictionary state)
{
bool retval = base.BeforeSave(state);
state["Password"] = Global.Encrypt("password");
return retval;
}
最后保存您的实例:
protected void btnSave_Click(object sender, EventArgs e)
{
try
{
qfh.User user = null;
user = new qfh.User();
user.UserName = txtUserName.Text;
user.Name = txtName.Text;
user.IsAdministrator = cboIsAdministrador.SelectedValue == "Yes";
user.IsActive = cboIsActive.SelectedValue == "Yes";
user.SaveCopy();
}
catch (Exception ex)
{
ex = Utilities.GetInnerException(ex);
JSLiteral.Text = Utilities.GetFormattedExceptionMessage(ex);
}
}
我通常使用SaveCopy()来使用overriden方法FindDirty(object id,IDictionary previousState,IDictionary currentState,NHibernate.Type.IType [] types)来获取类的先前值。
希望它有所帮助。
答案 1 :(得分:1)
使用BeforeSave()进行保存,使用OnFlushDirty()进行更新。
答案 2 :(得分:0)
你可以这样做
[ActiveRecord("PostTable")]
public class Post : ActiveRecordBase<Post>
{
private int _id;
private DateTime _created;
[PrimaryKey]
public int Id
{
get { return _id; }
set { _id = value; }
}
[Property("created")]
public DateTime Created
{
get { return _created; }
set { _created = value; }
}
private void BeforeUpdate()
{
// code that run before update
Created = DateTime.Now;
}
public override void Update()
{
BeforeUpdate();
base.Update();
}
答案 3 :(得分:0)
我遇到了同样的问题并以这种方式解决了这个问题:
我使用OnUpdate()
和OnSave()
。如您所述,此解决方案不适用于主详细信息方案。为此,我明确地设置了每个孩子的父母。请注意以下代码:
[ActiveRecord(Lazy = true)]
public class Lookup : ActiveRecordBase<Lookup>
{
[HasMany(typeof(LookupItem), Cascade = ManyRelationCascadeEnum.All)]
public virtual IList Items { set; get; }
//other properties...
}
[ActiveRecord(Lazy = true)]
public class LookupItem : ActiveRecordBase<LookupItem>
{
[BelongsTo("Lookup_id")]
public virtual Lookup ContainerLookup { set; get; }
//other properties...
}
void SaveLookup()
{
Lookup lookup = GetLookup();
LookupItem lookupItem = new LookupItem()
{
Title = LookupItemName,
ContainerLookup = lookup
};
lookup.Items.Add(lookupItem);
lookup.Save();
}