Sql server 2008 NHibernate Lazy Loaded属性存在复合键问题(在SQLServer2008中的SQLite中不起作用)
所以我有一门课:Sql server 2008 NHibernate Lazy Loaded属性存在复合键问题(在SQLServer2008中的SQLite中不起作用),sql-server-2008,sqlite,nhibernate,fluent-nhibernate,lazy-loading,Sql Server 2008,Sqlite,Nhibernate,Fluent Nhibernate,Lazy Loading,所以我有一门课: public class objWalkdown { private objWalkdown_ID _walkdownId = new objWalkdown_ID(); public virtual objWalkdown_ID Id { get { return _walkdownId; } set { _walkdownId = value; } } public virtual String facility
public class objWalkdown {
private objWalkdown_ID _walkdownId = new objWalkdown_ID();
public virtual objWalkdown_ID Id {
get { return _walkdownId; }
set { _walkdownId = value; }
}
public virtual String facility {
get { return _walkdownId.facility; }
set { _walkdownId.facility = value; }
}
public virtual String walkdown {
get { return _walkdownId.walkdown; }
set { _walkdownId.walkdown = value; }
}
public virtual String activity {
get { return _walkdownId.activity; }
set { _walkdownId.activity = value; }
}
public virtual Boolean complete { get; set; }
public virtual Byte[] filedata { get; set; }
}
在另一个类中使用复合id设置的:
[Serializable]
public class objWalkdown_ID {
public virtual String facility { get; set; }
public virtual String walkdown { get; set; }
public virtual String activity { get; set; }
}
根据我的研究,为了便于在属性上进行延迟加载(即,常规复合键设置将不起作用),需要使用此序列化复合键,如下所示是我的Fluent NNibernate映射类:
public class objWalkdown_ORM : ClassMap<objWalkdown> {
public objWalkdown_ORM() {
Id(x => x.Id);
Map(x => x.facility);
Map(x => x.walkdown);
Map(x => x.activity);
Map(x => x.complete);
Map(x => x.filedata)
.CustomType("BinaryBlob")
.LazyLoad();
Table("tbPDFs");
}
}
请关注延迟加载部分,不要让我不使用它,这个问题的目的是要确定延迟加载到底有什么问题。正如我所说的,使用SQLite这个函数可以实现100%。如果删除延迟加载,它也可以在SQLite和SQLServer2008下工作,因此我认为后端的实际数据类型不是这样的
在检查巡检对象(在延迟加载之前)时,我遇到的具体错误是“System.InvalidOperationException-在不存在数据时尝试读取无效”。然而,确实存在数据。所以我认为这是NHibernate代理的问题
以下是堆栈跟踪:
at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
at System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i)
at NHibernate.Driver.NHybridDataReader.IsDBNull(Int32 i)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
at NHibernate.Persister.Entity.AbstractEntityPersister.InitializeLazyPropertiesFromDatastore(String fieldName, Object entity, ISessionImplementor session, Object id, EntityEntry entry)
at NHibernate.Persister.Entity.AbstractEntityPersister.InitializeLazyProperty(String fieldName, Object entity, ISessionImplementor session)
at NHibernate.Intercept.AbstractFieldInterceptor.InitializeField(String fieldName, Object target)
at NHibernate.Intercept.AbstractFieldInterceptor.Intercept(Object target, String fieldName, Object value)
at NHibernate.Intercept.DefaultDynamicLazyFieldInterceptor.Intercept(InvocationInfo info)
at objWalkdownProxy.get_filedata()
我希望有人能给我一些关于正确解决问题的建议。我已经有了一个解决方案,但它涉及HQL,当我需要文件数据时,它会急切地加载一个实体,这不是我想要做的。不幸的是,答案是。。。小故障。MSSQL2008中的表出现错误或损坏。在我的测试/调试过程中,我创建了一个全新的表,其规格完全相同,并且一切都能100%正常工作 不过,我想指出的一点是,在我的研究过程中,我发现MSSQLS2008中的主键大小只能为900字节,如果我想让NHibernate为我生成模式,我应该在Id字段上加一个.Length(900)
at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
at System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i)
at NHibernate.Driver.NHybridDataReader.IsDBNull(Int32 i)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
at NHibernate.Persister.Entity.AbstractEntityPersister.InitializeLazyPropertiesFromDatastore(String fieldName, Object entity, ISessionImplementor session, Object id, EntityEntry entry)
at NHibernate.Persister.Entity.AbstractEntityPersister.InitializeLazyProperty(String fieldName, Object entity, ISessionImplementor session)
at NHibernate.Intercept.AbstractFieldInterceptor.InitializeField(String fieldName, Object target)
at NHibernate.Intercept.AbstractFieldInterceptor.Intercept(Object target, String fieldName, Object value)
at NHibernate.Intercept.DefaultDynamicLazyFieldInterceptor.Intercept(InvocationInfo info)
at objWalkdownProxy.get_filedata()