【问题标题】:one-to-one mapping in Nhibernate 3Nhibernate 3中的一对一映射
【发布时间】:2015-08-20 21:59:26
【问题描述】:

我有以下课程

namespace Extractor.Mapping
{
    public class Application
    {
        public virtual Guid Id { get; set; }
        public virtual string intId { get; set; }
        virtual SQuery sQuery { get; set; }
    }
}


namespace Extractor.Mapping
{
    public class SQuery
    {
        public virtual int Id { get;set; } 
        public virtual Guid Application { get;set; } 
        public virtual string Type { get;set; }
    }
}

SQuery 和Application 的关系是SQuery 中名为“Application”的FK

这些是 de hbm 文件

应用程序.hbm.xml

<hibernate-mapping  xmlns="urn:nhibernate-mapping-2.2"
                    assembly="Extractor"
                    namespace="Extractor.Mapping">

  <class name="Application" >
    <id name="Id" column="Id">
      <generator class="assigned"/>
    </id>
    <property name = "intId" column = "IntId" type = "string"/>
    <one-to-one name="sQuery" property-ref ="Application" class="SicQuery"/>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>

SQuery.hbm.xml

<hibernate-mapping  xmlns="urn:nhibernate-mapping-2.2"
                    assembly="BuroExtractorD"
                    namespace="BuroExtractorD.Mapping">
  <class name="SQuery" >
    <id name="Id" column="Id">
      <generator class="increment"/>
    </id>
    <property name="Application" column="Application" type ="Guid"/>
    <property name="Type" column="Type" type="string"/>
  </class>
</hibernate-mapping>

所以,事情是这样的,当我尝试访问一些 SQuery 对象的列表时,我得到以下异常:

NHibernate.PropertyAccessException: Invalid Cast (check your mapping for property type mismatches); setter of Extractor.Mapping.SQuery ---> System.InvalidCastException

我尝试像这样到达那里:

ICriteria crit = session.CreateCriteria(typeof(SQuery));
IList<SQuery> list = crit.List<SQuery>();

提前致谢

【问题讨论】:

    标签: c# nhibernate nhibernate-mapping one-to-one


    【解决方案1】:

    one-to-one的要点是引用关系。这种映射不能是关于ValueTypes

    public class Application
    {
        public virtual SQuery sQuery { get; set; }
        ...
    }
    public class SQuery
    {
        // wrong, Guid is ValueType, not a reference 
        // public virtual Guid Application { get;set; } 
        // corrrect - one to one == bi-directional 
        public virtual Application Application { get;set; } 
        ...
    }
    

    然后映射应该是这样的

    <class name="Application" >
        ...
        // class should be SQuery
        //<one-to-one name="sQuery" property-ref ="Application" class="SicQuery"/>
        <one-to-one name="sQuery" property-ref="Application" class="SQuery"/>
    
     <class name="SQuery" >
        ...
        <many-to-one name="Application" class="Application" 
                     column="Application" unique="true"/>
    

    在这里查看更多:

    5.1.2. hibernate-mapping

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多