Nhibernate 他有很多

Nhibernate 他有很多,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我在理解上有差距,我将感谢任何帮助 当我使用列表创建HasMany关系时,nhibernate会在我的子表上创建一个“索引”列。如果我使用联接查询表,它会因“集合上的空索引”而崩溃 我不理解的是——这个“索引”列是如何管理/填充的 我的相关代码: 母公司(产品) 我的结局是: [HibernateException: null index column for collection: Test.Licenses] NHibernate.Persister.Collection.Abstra

我在理解上有差距,我将感谢任何帮助

当我使用列表创建HasMany关系时,nhibernate会在我的子表上创建一个“索引”列。如果我使用联接查询表,它会因“集合上的空索引”而崩溃

我不理解的是——这个“索引”列是如何管理/填充的

我的相关代码:

母公司(产品)

我的结局是:

[HibernateException: null index column for collection: Test.Licenses]
   NHibernate.Persister.Collection.AbstractCollectionPersister.ReadIndex(IDataReader rs, String[] aliases, ISessionImplementor session) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Persister\Collection\AbstractCollectionPersister.cs:703
   NHibernate.Collection.PersistentList.ReadFrom(IDataReader rs, ICollectionPersister role, ICollectionAliases descriptor, Object owner) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Collection\PersistentList.cs:120
   NHibernate.Loader.Loader.ReadCollectionElement(Object optionalOwner, Object optionalKey, ICollectionPersister persister, ICollectionAliases descriptor, IDataReader rs, ISessionImplementor session) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:706
   NHibernate.Loader.Loader.ReadCollectionElements(Object[] row, IDataReader resultSet, ISessionImplementor session) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:385
   NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:326
   NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:453
   NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:236
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:1649
   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:1568
...
编辑 我将收藏更改为Bag(或Set),我收到了一个不同的问题:

Line 30:        public void SetPropertyValues(object target, object[] values)
Line 31:        {
Line 32:            setDelegate(target, values, setterCallback);
Line 33:        }
Line 34: 


Source File: D:\source\Test\FNH\src\NHibernate\Bytecode\Lightweight\AccessOptimizer.cs    Line: 32

Stack Trace:

[InvalidCastException: Specified cast is not valid.]
   (Object , Object[] , SetterCallback ) +409
   NHibernate.Bytecode.Lightweight.AccessOptimizer.SetPropertyValues(Object target, Object[] values) in D:\source\Test\FNH\src\NHibernate\Bytecode\Lightweight\AccessOptimizer.cs:32
   NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values) in D:\source\Test\FNH\src\NHibernate\Tuple\Entity\PocoEntityTuplizer.cs:292

[PropertyAccessException: Invalid Cast (check your mapping for property type mismatches); setter of Test.License]
   NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values) in D:\source\Test\FNH\src\NHibernate\Tuple\Entity\PocoEntityTuplizer.cs:296
。。。 当我找到它时,问题似乎是我的孩子班是:

公共类许可证 {

}


但它试图将父类的一个实例放在Product_ID字段中。所以它实际上是试图将Product_ID映射到Product类的一个实例。因此,我最终得到了一个包含一系列许可证的产品,它希望阵列中的每个许可证都包含父产品的一个实例。

尝试将其映射为无序集合(bag):

另外,我假设您在这里指的是产品,而强制转换是不必要的,因为
List
实现了
IList

公共类产品
{
...
公共虚拟IList许可证{get;set;}
公共产品()
{
许可证=新列表();
}
}

希望这能有所帮助。

您不能将Inverse()与有序集合(如列表)一起使用-如果您想将其有序化,则需要省略Inverse()并将其从父项中保留下来

谢谢。这是可行的,但是我仍然想了解在需要“AsList”的情况下如何处理索引列。我见过很多使用AsList()的例子,所以我假设它不是“不允许的”。实际上它也不能作为一个包使用(可能是另一个问题?)。我得到一个演员阵容错误。我更新了原来的帖子。我从源代码处编译了nHibernate,以获得关于崩溃的更多信息。它似乎在尝试创建子产品数组,并创建Product_ID列作为父类的实例。AsList将集合映射为有序集合,并且必须有一个数据库列来存储索引。这是一个很好的概述:谢谢Jamie,这确实解决了AsBag()的问题。AsList()我仍然有空索引错误。但我会把你的回答标记为接受。我希望有人能向我解释AsList的问题!谢谢,我会看这篇文章的。。我想我们在发帖的时候交叉了线。
   criteria.Add(Restrictions.Disjunction()
                        .Add(Restrictions.Like("Name", kw))
                        .Add(Restrictions.Like("Description", kw)))
                        .CreateAlias("Licenses", "License",   NHibernate.SqlCommand.JoinType.LeftOuterJoin);
[HibernateException: null index column for collection: Test.Licenses]
   NHibernate.Persister.Collection.AbstractCollectionPersister.ReadIndex(IDataReader rs, String[] aliases, ISessionImplementor session) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Persister\Collection\AbstractCollectionPersister.cs:703
   NHibernate.Collection.PersistentList.ReadFrom(IDataReader rs, ICollectionPersister role, ICollectionAliases descriptor, Object owner) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Collection\PersistentList.cs:120
   NHibernate.Loader.Loader.ReadCollectionElement(Object optionalOwner, Object optionalKey, ICollectionPersister persister, ICollectionAliases descriptor, IDataReader rs, ISessionImplementor session) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:706
   NHibernate.Loader.Loader.ReadCollectionElements(Object[] row, IDataReader resultSet, ISessionImplementor session) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:385
   NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:326
   NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:453
   NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:236
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:1649
   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) in D:\source\elysium\Elysium.Web\FNH\src\NHibernate\Loader\Loader.cs:1568
...
Line 30:        public void SetPropertyValues(object target, object[] values)
Line 31:        {
Line 32:            setDelegate(target, values, setterCallback);
Line 33:        }
Line 34: 


Source File: D:\source\Test\FNH\src\NHibernate\Bytecode\Lightweight\AccessOptimizer.cs    Line: 32

Stack Trace:

[InvalidCastException: Specified cast is not valid.]
   (Object , Object[] , SetterCallback ) +409
   NHibernate.Bytecode.Lightweight.AccessOptimizer.SetPropertyValues(Object target, Object[] values) in D:\source\Test\FNH\src\NHibernate\Bytecode\Lightweight\AccessOptimizer.cs:32
   NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values) in D:\source\Test\FNH\src\NHibernate\Tuple\Entity\PocoEntityTuplizer.cs:292

[PropertyAccessException: Invalid Cast (check your mapping for property type mismatches); setter of Test.License]
   NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values) in D:\source\Test\FNH\src\NHibernate\Tuple\Entity\PocoEntityTuplizer.cs:296
public virtual Guid Id { get; private set; }
...
public virtual Guid Product_ID { get; set; }
HasMany<License>(x => x.Licenses)
    .Inverse()
    .Not.LazyLoad()
    .AsBag()
    .Cascade.AllDeleteOrphan()
    .ForeignKeyCascadeOnDelete()
    .KeyNullable()
    .KeyColumn("Product_ID")
   public class License
   {
         ...
         public virtual Product {get; set;}
   }
   public class Product
   {
         ...
         public virtual IList<License>  Licenses { get; set; }
         public Product()
         {
            Licenses = new List<License>();
         }
   }