如何使用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(); }