可以在nhibernate中的字段上设置临时忽略(因此它不会在提交时更新该字段)

时间:2011-06-04 05:40:34

标签: nhibernate

我想知道什么时候我得到了我的对象(让我们说文件)并且我对它进行了这些修改。

File.Name = "test";
File.Id = 1;
File.Date = "6/3/2011 12:00:00 am";
File.IsLocked = false

所以我找回了这个文件对象,但是Date不在当地时间。因此,当我收回它时,我马上将其转换为当地时间。

我马上就这样做(使用相同的repo方法),因为此时此日期应始终在当地时间。我可以在不同的点上转换它来解决我的问题但是程序员总是要记住一旦他们回到File对象就必须手动调用convertToLocalTime()方法。

从过去的经历来看,这种情况很糟糕,很多次它被遗忘转换为当地时间。所以我真的想把它留在那里。

所以我的问题是这个

文件现在看起来像这样一旦返回

File.Name = "test";
    File.Id = 1;
    File.Date = "6/3/2011 5:00:00pm";
    File.IsLocked = false

现在我必须使用此对象并将File.IsLocked更改为True

File.Name = "test";
    File.Id = 1;
    File.Date = "6/3/2011 5:00:00pm";
    File.IsLocked = true

现在问题是我需要保存这个但我不想保存当地时间。我想在这一次提交时忽略这一点(可能还有其他时候需要保存Date而不是在这个例子中)

我可以告诉nhibernate不保存转换后的日期吗?

1 个答案:

答案 0 :(得分:0)

如果你使用拦截器类,你可以调用convertToLocalTime()而不必让程序员必须这样做!

public class TestInterceptor
  : EmptyInterceptor, IInterceptor
{
    private readonly IInterceptor innerInterceptor;

    public TestInterceptor(IInterceptor innerInterceptor)
    {
        this.innerInterceptor = this.innerInterceptor ?? new EmptyInterceptor();
    }


 public override bool OnSave(object entity, 
                                object id, 
    object[] state, 
    string[] propertyNames, 
    IType[] types)
    {
        if ( entity is yourType) {
            //call convertToLocalTime()
        }
        return this.innerInterceptor.OnSave(entityName, id,state,propertyNames,types);
    }


}

HTH

<强>更新

拦截器类允许您覆盖为每个实体调用的基本nhibernate方法,如OnSave,OnLoad ....

看这里:

Implementing NHibernate Interceptors

你可以流利地配置它:

return Fluently.Configure()
           ...
            .ExposeConfiguration(c =>{c.Interceptor = new TestInterceptor(c.Interceptor ?? new EmptyInterceptor());})
            ...
            .BuildConfiguration();