我發現了一個的tuplizer的這個例子中節省空當的關係做保存0。由於我正在處理遺留數據庫模式上的應用程序,因此這是必需的。NHibernate的,保存爲0(零)DB空的參考價值
我想這裏的tuplizer:http://nhforge.org/blogs/nhibernate/archive/2011/01/28/how-to-use-0-instead-of-null-for-foreign-keys.aspx
在這個例子中,我得到了在ProxyFactory一個NullReferenceException。然後,我發現了一個更新,這裏的代碼:https://bitbucket.org/jfromaniello/hotgazpachoeg/changeset/87ac41c473ae
然而,這並不爲我工作,要麼。在最後的方法,SetPropertyValues(被描述爲骯髒的黑客3,閱讀從數據庫對象時使用),我得到這部分nullref例外,如果(typeof運算(IEntity),讀一本不相關的對象(而不是樣本)
時我的映射如下(簡化):
Table("ej_sample");
Not.LazyLoad();
Id(s => s.Id, "sampleID").GeneratedBy.Native();
References<Sample>(s => s.ParentSample, "parentSampleID").NotFound.Ignore();
當該對象不存在的parentSampleID列必須是0
我想,我只需要做上插入和更新髒黑客。 (可能在我的情況下只能插入)
On inser t,我想創建一個僞代理,但[2]中的代碼從db加載實體(可能使用空對象?!)。
插入骯髒的黑客:
public override object[] GetPropertyValuesToInsert(object entity, IDictionary mergeMap, ISessionImplementor session) {
var values = base.GetPropertyValuesToInsert(entity, mergeMap, session);
//dirty hack 1
for(int i = 0; i < values.Length; i++) {
if(values[i] == null && typeof(IEntity).IsAssignableFrom(getters[i].ReturnType)) {
values[i] = ((ISession)session).Load(getters[i].ReturnType, 0);
}
}
return values;
}
我試圖創建一個假的代理,而不是做好上面的:
public override object[] GetPropertyValuesToInsert(object entity, IDictionary mergeMap, ISessionImplementor session) {
var values = base.GetPropertyValuesToInsert(entity, mergeMap, session);
//dirty hack 1
for(int i = 0; i < values.Length; i++) {
if(values[i] == null && typeof(IEntity).IsAssignableFrom(getters[i].ReturnType)) {
//values[i] = ((ISession)session).Load(getters[i].ReturnType, 0);
values[i] = CreateFakeProxy(i);
}
}
return values;
}
private object CreateFakeProxy(int i) {
object proxy;
using(var sessionImplementor = _sessionFactory.OpenSession()) {
proxy = _sessionFactory
.GetEntityPersister(getters[i].ReturnType.FullName)
.CreateProxy(0, (ISessionImplementor)sessionImplementor);
}
return proxy;
}
然後我上_sessionfactory,這是在構造函數設置nullref例外:
private readonly ISessionFactoryImplementor _sessionFactory;
public NullableTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity)
: base(entityMetamodel, mappedEntity) {
_sessionFactory = entityMetamodel.SessionFactory;
}
任何想法如何做到這一點?
您將與ISessionImplementor無關的'ISession'強制轉換爲'ISessionImplementor'。更安全的是'session.GetSessionImplementor()' – Firo 2012-03-13 16:04:48