Как OnSave работает в Castle ActiveRecord?

Я новичок в Castle ActiveRecord, и у меня возникли небольшие трудности с обновлением объекта перед его сохранением. После прочтения документа я ожидал, что OnSave или BeforeSave всегда будут обновлять объект до вызова базы данных, но, похоже, это не так.

Иногда значение устанавливается, иногда нет. Я пробовал как OnSave, так и BeforeSave, и из того, что я могу сказать, глядя в NH Prof, иногда значение просто NULL. Я пробовал Flushing, SaveAndFlush, SaveCopy и т. Д. Без изменений.

Вот мой пример кода:

[ActiveRecord]
public class Blog : ActiveRecordValidationBase<Blog>
{
    [PrimaryKey] public int Id { get; set; }
    [Property] public DateTime CreatedOn { get; set; }
    [Property] public string Name { get; set; }       
    [Property] public string Author { get; set; }

    protected override void OnSave()
    {
        Author = "Test Author 1";

        base.OnSave();
    }
}

// in a test:
var blog = new Blog { Name = "First Blog", CreatedOn = DateTime.UtcNow };
blog.Save();


INSERT INTO Blog (
    CreatedOn, 
    Name, 
    Author
)
VALUES (
    '2011-07-25T14:48:06.00' /* @p0 */, 
    'First Blog' /* @p1 */,
    NULL /* @p2 */
)

Это проблема с промывкой, я не понимаю, как работает OnSave, или это что-то еще? Я использую бета-версию ActiveRecord 3.0 от Nuget, в этом ли проблема? Любая помощь была бы замечательной, спасибо.

Обновить

Посмотрев на это подробнее, я думаю, что вижу проблему. Если поле не допускает значения NULL, вставка не выполняется. Но если поле допускает значение NULL, отдельные команды Insert и Update генерируются один за другим, и это работает.

Могу ли я установить в базе данных поле, не допускающее значения NULL, в OnSave с помощью ActiveRecord?


person blu    schedule 25.07.2011    source источник


Ответы (1)


Вы можете переопределить

    Save()

метод и реализуйте там свою логику так же, как вы делаете с OnSave, он должен работать так, как вы хотите.

person Alexei Eleusis Díaz Vera    schedule 01.08.2011