在NHibernate中将对象声明为不脏

时间:2019-06-20 12:47:38

标签: c# nhibernate

关于如何执行此操作的文章很多,但是没有一个可以解决我的问题。

我有一个PreLoadEventListener,如果用户无权将其指定的属性或集合设置为null。

public void OnPreLoad(PreLoadEvent @event)
    {
        if (// I check permission here)
        {
            int index = 0;

            // Set values to null if user is not permitted
            foreach (object obj in @event.State)
            {
                @event.State.SetValue(null, index);

                index++;
            }
        }
    }

我们这样说:

public class Employee {
    private virtual int Id {get;set}
    private virtual string Name {get;set;}
    private virtual List<Document> Documents {get;set;}
}

public class Document {
    private virtual int Id {get;set;};
    private virtual byte[] Binary {get;set;}
}

现在我说Documents没有权限,而其余的则具有读取权限。

NHibernate现在认为Documents的空值是一个脏对象,并将空值保存到数据库中。

我还有一个自定义的FindDirty()和PreFlush()方法,用于检查是否允许用户使用,然后将其标记为不脏。 它们似乎并未在实体的Get上被调用。

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

将实体标记为只读可能会有所帮助。但是请,请考虑接受@AmitJoshi的建议

public void OnPreLoad(PreLoadEvent @event)
{
    if (/* Check permission here */)
    {
        int index = 0;

        // Set values to null if user is not permitted
        foreach (object obj in @event.State)
        {
            @event.State.SetValue(null, index);

            index++;
        }

        @event.Session.SetReadOnly(@event.Entity, true); 
    }
}