关于如何执行此操作的文章很多,但是没有一个可以解决我的问题。
我有一个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上被调用。
有什么想法吗?谢谢。
答案 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);
}
}