如何使用Castle ActiveRecord在保存或更新期间自动填充字段

问题:我们数据库中的所有表都有CreatedDate,CreatedBy,ChangedDate,ChangedBy字段,我希望在保存/更新ActiveRecord实体时自动设置这些字段。

我的第一次尝试是覆盖Save()和Update()方法。 但是,当我在实体上执行直接Save()或Update()时,只会调用这些方法。 它们不是在Master – Detail场景中调用的,我只在master上调用Save()。

接下来尝试的是OnSave()和OnUpdate()方法,但是这些字段中的更改未在数据库中保留。

最后我尝试了BeforeSave()方法。 但更新时不会调用此方法。

问题:如何在Save()或Update()期间自动设置这些CreatedDate,CreatedBy,ChangedDate,ChangedBy字段?

要按照您的意愿修改数据,您必须覆盖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)来获取类的先前值。

希望能帮助到你。

使用BeforeSave()进行保存,使用OnFlushDirty()进行更新。

你可以这样做

 [ActiveRecord("PostTable")] public class Post : ActiveRecordBase { 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(); } 

我有同样的问题并以这种方式解决了它:

我使用OnUpdate()OnSave() 。 如您所述,此解决方案不适用于主详细信息方案。 为此,我明确地设置了每个孩子的父母。 请注意以下代码:

 [ActiveRecord(Lazy = true)] public class Lookup : ActiveRecordBase { [HasMany(typeof(LookupItem), Cascade = ManyRelationCascadeEnum.All)] public virtual IList Items { set; get; } //other properties... } [ActiveRecord(Lazy = true)] public class LookupItem : ActiveRecordBase { [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(); }