我发现这个 tuplizer 示例在保存空关系时可以保存 0。这是必需的,因为我正在使用旧数据库架构上的应用程序。
我在这里尝试了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 (描述为脏 hack 3,从 DB 读取对象时使用),我在这部分得到 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。
我想,我只需要在插入和更新(可能在我的情况下只有插入)上做一些肮脏的黑客攻击。
在插入时,我想创建一个假代理,但 [2] 中的代码从数据库加载实体(可能使用 Null 对象?!)。
插入脏黑客:
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;
}
然后我在 ctor 中设置的 _sessionfactory 上得到一个 nullref 异常:
private readonly ISessionFactoryImplementor _sessionFactory;
public NullableTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity)
: base(entityMetamodel, mappedEntity) {
_sessionFactory = entityMetamodel.SessionFactory;
}
任何想法如何做到这一点?