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()