NHibernate:无效的转换(检查属性类型不匹配的映射);

弯头

我有一个类ProductCategoryModel:

public class ProductCategoryModel
{
    public virtual int id { get; set; }
    public virtual string name { get; set; }
    public virtual int parentId { get; set; }
    public virtual Iesi.Collections.Generic.ISet<ProductCategoryModel> subCategory { get; set; }
}

这是我的映射XML:

    <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Shop.Domain.Model.ProductCategory" assembly="Shop.Domain">
  <class name="ProductCategoryModel">
    <id name="id" column="id">
      <generator class="native" />
    </id>
    <property name="name" not-null="true" length="50" type="string" column="name"/>
    <many-to-one name="parentId" not-null="true" class="ProductCategoryModel" column="parentId"/>
    <set name="subCategory" inverse="true">
      <key column="parentId"/>
      <one-to-many class="ProductCategoryModel"/>
    </set>
  </class>
</hibernate-mapping>

我的数据库表包含:

id: 2, name: "...", parentId: 0
id: 3, name: "...", parentId: 2 
id: 4, name: "...", parentId: 2

现在,我要选择ID为2的类别:

session1.Get<ProductCategoryModel>(id);

但是Nhibernate抛出异常:

        NHibernate.PropertyAccessException was unhandled
  HResult=-2146232832
  Message=Invalid Cast (check your mapping for property type mismatches); setter of Shop.Domain.Model.ProductCategory.ProductCategoryModel
  Source=NHibernate
  StackTrace:
       w NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values)
       w NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValues(Object entity, Object[] values)
       w NHibernate.Persister.Entity.AbstractEntityPersister.SetPropertyValues(Object obj, Object[] values, EntityMode entityMode)
       w NHibernate.Engine.TwoPhaseLoad.InitializeEntity(Object entity, Boolean readOnly, ISessionImplementor session, PreLoadEvent preLoadEvent, PostLoadEvent postLoadEvent)
       w NHibernate.Loader.Loader.InitializeEntitiesAndCollections(IList hydratedObjects, Object resultSetId, ISessionImplementor session, Boolean readOnly)
       w NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
       w NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
       w NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
       w NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)
       w NHibernate.Loader.Entity.AbstractEntityLoader.Load(ISessionImplementor session, Object id, Object optionalObject, Object optionalId)
       w NHibernate.Loader.Entity.AbstractEntityLoader.Load(Object id, Object optionalObject, ISessionImplementor session)
       w NHibernate.Persister.Entity.AbstractEntityPersister.Load(Object id, Object optionalObject, LockMode lockMode, ISessionImplementor session)
       w NHibernate.Event.Default.DefaultLoadEventListener.LoadFromDatasource(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
       w NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
       w NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
       w NHibernate.Event.Default.DefaultLoadEventListener.ProxyOrLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
       w NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
       w NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
       w NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
       w NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
       w NHibernate.Impl.SessionImpl.Get[T](Object id)
       w Shop.Infrastructure.Repositories.ProductCategoryIM.GetCategoryById(Int32 id) w f:\Uczelnia\!Semestr VI\Kurs aplikacji bazodanowych\KubutShop2\KubutShop\Shop.Infrastructure\Repositories\ProductCategoryIM.cs:wiersz 58
       w Shop.Application.Front.FrontService.GetProductCategoryById(Int32 id) w f:\Uczelnia\!Semestr VI\Kurs aplikacji bazodanowych\KubutShop2\KubutShop\Shop.Application\Front\Front.cs:wiersz 139
       w Presentation.ConsoleApp.Program.Main(String[] args) w f:\Uczelnia\!Semestr VI\Kurs aplikacji bazodanowych\KubutShop2\KubutShop\Presentation.ConsoleApp\Program.cs:wiersz 40
       w System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       w System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       w Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       w System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       w System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       w System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.InvalidCastException
       HResult=-2147467262
       Message=Nie można rzutować obiektu typu 'NHibernate.Collection.Generic.PersistentGenericSet`1[Shop.Domain.Model.ProductCategory.ProductCategoryModel]' na typ 'Iesi.Collections.Generic.ISet`1[Shop.Domain.Model.ProductCategory.ProductCategoryModel]'.
       Source=Shop.Domain
       StackTrace:
            w (Object , Object[] , SetterCallback )
            w NHibernate.Bytecode.Lightweight.AccessOptimizer.SetPropertyValues(Object target, Object[] values)
            w NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values)
       InnerException: 

消息=无法转换类型为“ NHibernate.Collection.Generic.PersistentGenericSet 1[Shop.Domain.Model.ProductCategory.ProductCategoryModel]' na typ Iesi.Collections.Generic.ISet1 [Shop.Domain.Model.ProductCategory.ProductCategoryModel]”的对象。

意思是这样的:

Message =无法转换'NHibernate.Collection.Generic.PersistentGenericSet 1[Shop.Domain.Model.ProductCategory.ProductCategoryModel]' to type Iesi.Collections.Generic.ISet1 [Shop.Domain.Model.ProductCategory.ProductCategoryModel]'

我做错了什么?我读过很多类似的主题,但我仍然不知道哪里出了错误。PS对不起,我的英语不好;)

拉迪姆·科勒

对于最新的NHibernate 4.0+版本,我们应该牢记在本问答中描述的真正关键的更改

让我引用一下(摘自发行说明):

**从NH3.3.3.GA到4.0.0.GA的已知中断更改

NHibernate现在针对.Net 4.0。现在,已将Iesi.Collections中的集合类型的许多用途更改为使用BCL中的相应类型。这些类型的API略有不同。

所以-现在我们将System使用任何iesi东西,例如:

System.Collections.Generic.ISet<T>

第二件事,非常重要,是我们需要创建双向映射,one-to-many并且many-to-one这意味着我们不能

// not iesi
// we need System
using System.Collections.Generic;
using System.Collections.ObjectModel;

...

public class ProductCategoryModel
{
    ...
    // could be used just as navigation property
    public virtual int parentId { get; set; }
    // This is must with inverse="true"
    public virtual ProductCategoryModel Parent { get; set; }
    // the System.Collections.Generic
    public virtual ISet<ProductCategoryModel> SubCategories { get; set; }
    ...

并映射:

...
// readonly
<property  name="parentId" not-null="true" column="parentId" type="string"
                                      insert="false" update="false" />
// inverse end
<many-to-one name="Parent" not-null="true" class="ProductCategoryModel" column="parentId"/>

<set name="SubCategories" inverse="true" batch-size="25">
  <key column="parentId"/>
  <one-to-many class="ProductCategoryModel"/>
</set>
...

如我们所见,我们可以为many-to-one (引用)和为进行映射property (valueType or string)其中之一必须是只读的(insert =“ false” update =“ false”)

注意:不要忘记,因为我们使用逆函数,所以我们必须在C#中设置关系的两边...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

强制转换无效(请检查您的映射是否存在属性类型不匹配)

来自分类Dev

绑定不匹配错误:类型无效

来自分类Dev

nHibernate:如何映射可以是任何类型的属性?

来自分类Dev

通过代码进行Nhibernate映射,无法确定属性的类型

来自分类Dev

在Fluent NHibernate中映射自定义类型属性

来自分类Dev

NHibernate-映射运行时定义类型的属性

来自分类Dev

Firestore DocumentReference 类型检查不匹配

来自分类Dev

转换错误(类型约束不匹配)

来自分类Dev

映射列标题时出现类型不匹配错误

来自分类Dev

类型类型不匹配:无法从RegisterFragment转换为Fragment

来自分类Dev

类型不匹配:无法从元素类型对象转换为Cookie

来自分类Dev

类型不匹配:无法从元素类型Object转换为Cookie

来自分类Dev

类型不匹配:无法从元素类型 Object 转换为 List

来自分类常见问题

默认值类型与属性的类型不匹配

来自分类Dev

属性类型与访问者类型不匹配

来自分类Dev

类型不匹配?“ ...缺少类型中的以下属性...”

来自分类Dev

语义问题:属性类型与访问器类型不匹配

来自分类Dev

属性与主类中的属性类型不匹配

来自分类Dev

属性与主类中的属性类型不匹配

来自分类Dev

NHibernate 组件映射:操作数类型冲突:bigint 与时间不兼容

来自分类Dev

检查单元格的值时类型不匹配

来自分类Dev

UIMA RUTA:如何检查不匹配的特征注释对象的属性

来自分类Dev

获得“类型不匹配:不能从转换的ArrayList <HashMap的<字符串,字符串>>将列表<地图<String,字符串>>”在实例映射列表

来自分类Dev

类型不匹配:无法从布尔值转换为整数

来自分类Dev

类型不匹配:无法从ListFragment转换为Fragment

来自分类Dev

类型不匹配:无法从long转换为int

来自分类Dev

类型不匹配:无法从Object转换为Class对象

来自分类Dev

Java泛型。类型不匹配:无法从对象转换为

来自分类Dev

类型不匹配无法从片段转换为片段

Related 相关文章

  1. 1

    强制转换无效(请检查您的映射是否存在属性类型不匹配)

  2. 2

    绑定不匹配错误:类型无效

  3. 3

    nHibernate:如何映射可以是任何类型的属性?

  4. 4

    通过代码进行Nhibernate映射,无法确定属性的类型

  5. 5

    在Fluent NHibernate中映射自定义类型属性

  6. 6

    NHibernate-映射运行时定义类型的属性

  7. 7

    Firestore DocumentReference 类型检查不匹配

  8. 8

    转换错误(类型约束不匹配)

  9. 9

    映射列标题时出现类型不匹配错误

  10. 10

    类型类型不匹配:无法从RegisterFragment转换为Fragment

  11. 11

    类型不匹配:无法从元素类型对象转换为Cookie

  12. 12

    类型不匹配:无法从元素类型Object转换为Cookie

  13. 13

    类型不匹配:无法从元素类型 Object 转换为 List

  14. 14

    默认值类型与属性的类型不匹配

  15. 15

    属性类型与访问者类型不匹配

  16. 16

    类型不匹配?“ ...缺少类型中的以下属性...”

  17. 17

    语义问题:属性类型与访问器类型不匹配

  18. 18

    属性与主类中的属性类型不匹配

  19. 19

    属性与主类中的属性类型不匹配

  20. 20

    NHibernate 组件映射:操作数类型冲突:bigint 与时间不兼容

  21. 21

    检查单元格的值时类型不匹配

  22. 22

    UIMA RUTA:如何检查不匹配的特征注释对象的属性

  23. 23

    获得“类型不匹配:不能从转换的ArrayList <HashMap的<字符串,字符串>>将列表<地图<String,字符串>>”在实例映射列表

  24. 24

    类型不匹配:无法从布尔值转换为整数

  25. 25

    类型不匹配:无法从ListFragment转换为Fragment

  26. 26

    类型不匹配:无法从long转换为int

  27. 27

    类型不匹配:无法从Object转换为Class对象

  28. 28

    Java泛型。类型不匹配:无法从对象转换为

  29. 29

    类型不匹配无法从片段转换为片段

热门标签

归档