Howto автоматически заполняет поля во время сохранения или обновления с помощью Castle ActiveRecord

Проблема. Все таблицы в нашей базе данных имеют поля CreateDate, CreatedBy, ChangedDate, ChangedBy, которые я хочу установить автоматически при сохранении / обновлении объекта ActiveRecord.

Моя первая попытка состояла в том, чтобы переопределить методы Save () и Update (). Но эти методы вызываются только тогда, когда я делаю прямое сохранение () или Update () для объекта. Они не вызываются в сценарии Master-Detail, где я вызываю Save () только на master.

Следующей попыткой были методы OnSave () и OnUpdate (), но здесь изменения в полях не сохранялись в базе данных.

Наконец, я попробовал метод BeforeSave (). Но этот метод не вызывается при обновлении.

Вопрос. Как настроить автоматическое создание полей CreateDate, CreatedBy, ChangedDate, ChangedBy во время Save () или Update ()?

    Чтобы изменить данные по своему усмотрению, вам необходимо переопределить метод 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 (), чтобы использовать метод override для FindDirty (идентификатор объекта, IDictionary previousState, IDictionary currentState, NHibernate.Type.IType []), чтобы получить предыдущие значения classа.

    Надеюсь, поможет.

    Используйте Use 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(); }