Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在使用Castle ActiveRecord保存或更新期间自动填充字段_C#_Castle Activerecord - Fatal编程技术网

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

C# 如何在使用Castle ActiveRecord保存或更新期间自动填充字段,c#,castle-activerecord,C#,Castle Activerecord,问题: 数据库中的所有表都有CreatedDate、CreatedBy、ChangedDate、ChangedBy字段,我希望在保存/更新ActiveRecord实体时自动设置这些字段 我的第一次尝试是重写Save()和Update()方法。但是这些方法只有在我对实体执行直接Save()或Update()时才会被调用。在Master-Detail场景中,它们不会被调用,我只在Master上调用Save() 下一次尝试是OnSave()和OnUpdate()方法,但这里字段中的更改不会持久化到数据

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

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

下一次尝试是OnSave()和OnUpdate()方法,但这里字段中的更改不会持久化到数据库中

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

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

您可以这样做

[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();            
    }
[ActiveRecord(“PostTable”)]
公共类帖子:ActiveRecordBase
{
私人内部id;
创建私有日期时间;
[主密钥]
公共整数Id
{
获取{return\u id;}
设置{u id=value;}
}
[财产(“创建”)]
已创建公共日期时间
{
获取{return\u created;}
集合{u created=value;}
}
私有void BeforeUpdate()
{
//更新前运行的代码
Created=DateTime.Now;
}
公共覆盖无效更新()
{
BeforeUpdate();
base.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()来使用被重写的方法findderty(对象id、IDictionary previousState、IDictionary currentState、NHibernate.Type.IType[]类型)来获取类的先前值


希望能有所帮助。

我也遇到了同样的问题,并通过以下方式解决:

我使用
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();
}
[ActiveRecord(Lazy=true)]
公共类查找:ActiveRecordBase
{
[HasMany(typeof(LookupItem),Cascade=ManyRelationCascadeEnum.All)]
公共虚拟IList项{set;get;}
//其他属性。。。
}
[ActiveRecord(Lazy=true)]
公共类查找项:ActiveRecordBase
{
[BelongsTo(“查找id”)]
公共虚拟查找容器Lookup{set;get;}
//其他属性。。。
}
void SaveLookup()
{
Lookup=GetLookup();
LookupItem LookupItem=新的LookupItem()
{
Title=LookupItemName,
ContainerLookup=查找
};
lookup.Items.Add(lookupItem);
lookup.Save();
}

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

这种方法的问题是,只有在直接更新帖子(在您的示例中)时才会调用Update()方法。但是,当我更改帖子并在博客上调用Update(有许多帖子)时,不会自动调用帖子上的Update()方法。