gpt4 book ai didi

nhibernate - 流利的 Nhibernate HasMany

转载 作者:行者123 更新时间:2023-12-03 21:17:30 28 4
gpt4 key购买 nike

我在理解上存在差距,我将不胜感激任何帮助。

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

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

我的相关代码:

父级(产品)

  Class:
public class License
{
...
public virtual IList<License> Licenses { get; set; }
public Product()
{
Licenses = (IList<License>)new List<License>();
}
}

Mapping:

HasMany<License>(x => x.Licenses)
.Inverse()
.Not.LazyLoad()
.AsList()
.Cascade.AllDeleteOrphan()
.ForeignKeyCascadeOnDelete()
.KeyNullable()
.KeyColumn("Product_ID")

child (执照):

  Class:
public class License
{
...
public virtual Product_ID {get; set;}
}

Mapping:


...
References<Product>(x => x.Product_ID)
.Column("ParentProduct");
...

还有我的加入:

   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
...

编辑

我将集合更改为 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

...当我找到它时,问题似乎是我的 child 类(class)是:

公共(public)类许可证{

public virtual Guid Id { get; private set; }
...
public virtual Guid Product_ID { get; set; }

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

最佳答案

您不能将 Inverse() 与有序集合(例如列表)一起使用 - 如果您想让它有序,那么您需要省略 Inverse() 并将其从父项中保留

关于nhibernate - 流利的 Nhibernate HasMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2976453/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com