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

时间:2009-07-17 09:03:17

标签: c# castle-activerecord

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

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

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

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

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

4 个答案:

答案 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();
}