2013-07-03 39 views
1

我有一个asp.net应用程序,并添加一个库与我的域对象和xml文件。NHibernate.MappingException无法确定类型:实体

痕迹:

Message=Could not determine type for: VaLibrary.Core.Domain.VAEmpresa, VaLibrary, Version=1.0.5.18335, Culture=neutral, PublicKeyToken=null, for columns: NHibernate.Mapping.Column(IdDev) 

源= NHibernate的

我在web相同的错误进行搜索,但是,解决方案是其他映射选项(流畅,城堡等)不用于XML

我的代码类是这里

using System; 
    using System.Text; 
    using System.Collections.Generic; 
    namespace VaLibrary.Core.Domain { 

    public class VAEmpresa { 
     private int? _id; 
     private string _nombre; 
     private string _tipo; 
     public VAEmpresa() { 
      VAJu_Dev = new List<VAJu>(); 
      VAJu_Pub = new List<VAJu>(); 
     } 
     public virtual int Id { 
      get { 
       return (int)this._id; 
      } 
      set { 
       this._id = value; 
      } 
     } 
     public virtual string Nombre { 
      get { 
       return this._nombre; 
      } 
      set { 
       this._nombre = value; 
      } 
     } 
     public virtual string Tipo { 
      get { 
       return this._tipo; 
      } 
      set { 
       this._tipo = value; 
      } 
     } 
     public virtual IList<VAJu> VAJu_Dev { get; set; } 
     public virtual IList<VAJu> VAJu_Pub { get; set; } 
    } 
} 

和参考是:

using System; 
using System.Text; 
using System.Collections.Generic; 
namespace VaLibrary.Core.Domain { 

    public class VAJu { 
     private int? _id; 
     private VAEmpresa _idDev; 
     private VAEmpresa _idPub; 
     private VACon _vACon; 
     private string _titulo; 
     private int _numerop; 
     public VAJu() { 
      VApllist = new List<VApllist>(); 
     } 
     public virtual int Id { 
      get { 
       return (int)this._id; 
      } 
      set { 
       this._id = value; 
      } 
     } 
     public virtual VAEmpresa IdDev { 
      get { 
       return this._idDev; 
      } 
      set { 
       this._idDev = value; 
      } 
     } 
     public virtual VAEmpresa IdPub { 
      get { 
       return this._idPub; 
      } 
      set { 
       this._idPub = value; 
      } 
     } 
     public virtual VACon VACon { 
      get { 
       return this._vACon; 
      } 
      set { 
       this._vACon = value; 
      } 
     } 
     public virtual string Titulo { 
      get { 
       return this._titulo; 
      } 
      set { 
       this._titulo = value; 
      } 
     } 
     public virtual int Numerop { 
      get { 
       return this._numerop; 
      } 
      set { 
       this._numerop = value; 
      } 
     } 
     public virtual IList<VApllist> VApllist { get; set; } 
    } 
} 

的映射文件是:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping assembly="VaLibrary" namespace="VaLibrary.Core.Domain" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="VAEmpresa" table="VA-Empresa" lazy="true" > 
    <id name="Id" column="Id"> 
     <generator class="identity" /> 
    </id> 
    <property name="Nombre"> 
     <column name="nombre" sql-type="varchar" not-null="true" /> 
    </property> 
    <property name="Tipo"> 
     <column name="tipo" sql-type="varchar" not-null="false" /> 
    </property> 
    <bag name="VAJu_Dev" inverse="true" cascade="none"> 
     <key column="IdDev" /> 
     <one-to-many class="VaLibrary.Core.Domain.VAJu, VaLibrary" /> 
    </bag> 
    <bag name="VAJu_Pub" inverse="true" cascade="none"> 
     <key column="IdPub" /> 
     <one-to-many class="VaLibrary.Core.Domain.VAJu, VaLibrary" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping assembly="VaLibrary" namespace="VaLibrary.Core.Domain" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="VAJu" table="VA-Ju" lazy="true" > 
    <id name="Id" column="Id"> 
     <generator class="identity" /> 
    </id> 
    <property name="Titulo"> 
     <column name="Titulo" sql-type="varchar" not-null="true" /> 
    </property> 
    <many-to-one insert="false" update="false" lazy="false" name="IdDev"> 
     <column name="IdDev" sql-type="int" not-null="true" /> 
    </many-to-one> 
    <property name="IdDev"> 
     <column name="IdDev" sql-type="int" not-null="true" /> 
    </property> 
    <many-to-one insert="false" update="false" lazy="false" name="IdPub"> 
     <column name="IdPub" sql-type="int" not-null="true" /> 
    </many-to-one> 
    <property name="IdPub"> 
     <column name="IdPub" sql-type="int" not-null="true" /> 
    </property> 
    <property name="Numerop"> 
     <column name="numero-p" sql-type="int" not-null="true" /> 
    </property> 
    <bag name="VApllist" inverse="true" cascade="none"> 
     <key column="IdJu" /> 
     <one-to-many class="VApllist" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

在DB的relantionship是: VA-Ju.IdDev FK到VA-Empresa.Id PK VA- JU.IdPub FK到VA-Empresa.Id PK

我尝试更改为 ,但它是sa我。

我能做到吗?

非常感谢你对你的答案

[编辑]

我使用NHibernate的3.2

+0

为什么你有实体ID为可为空。我想知道这是否会造成麻烦,因为从数据完整性的角度来看,这并没有多大意义。 –

回答

1

映射缺少正确关系(对象对象)映射。怎么解释,最好的办法,就是比如:

更改此:

private VAEmpresa _idDev; 

public virtual VAEmpresa IdDev 
{ 
    get { return this._idDev; } 
    set { this._idDev = value; } 
} 

进入这个:

private VAEmpresa _dev; 

public virtual VAEmpresa Dev // Reference Object 
{ 
    get { return this._idDev; } 
    set 
    { 
     this._idDev = value; 
     if(_idDev != null)  // assure that with reference change 
     {      // the referenceId is changed as well 
      IdDev = _idDev.Id 
     } 
    } 
} 
public virtual int IdDev { get; set; } // Refernece Id 

现在我们有Dev参考(这是两个交涉键入VAEmpresa并且具有int id)。我们可以将其映射为工作方式。所以

更改此:

<many-to-one insert="false" update="false" lazy="false" name="IdDev"> 
    <column name="IdDev" sql-type="int" not-null="true" /> 
</many-to-one> 
<property name="IdDev"> 
    <column name="IdDev" sql-type="int" not-null="true" /> 
</property> 

成:

<many-to-one name="Dev" class="VAEmpresa" column="IdDev" 
     insert="false" update="false" lazy="false" /> 
<property name="IdDev" not-null="true" /> 

从那一刻开始,NHibernate的会知道哪里来搜索DB Dev财产。这将是列IdDev和类实例是VAEmpresa

如果代码只需要在referenceIdIdDev ...我们也有它。

小注:我的经验是使用不同的只读设置。可编辑是参考,只读参考。这迫使代码与现有的VAEmpresa对象一起工作,而IdDev可以是任何整数。处理是复杂的,但后来带来成果

+0

我有很多问题,代码生成我NHG [链接](http://nmg.codeplex.com/)。不要你理解为什么我必须改变很多事情 – user2547522

0

的ID可能需要的类型。您有:

<id name="Id" column="Id"> 
    <generator class="identity" /> 
</id> 

尝试指定类型如下:

<id name="Id" > 
    <column name="Id" sql-type="int" not-null="true" unique="true" /> 
    <generator class="identity" /> 
</id> 

的另一个问题是,你忘了把列/域的名称在包属性。您需要放置实际的列名称而不是属性名称。让我告诉你VAJu:

<bag name="VApllist" inverse="true" cascade="none"> 
    <key column="Id" /> 
    <one-to-many class="VaLibrary.Core.Domain.VApllist" column="Id" /> 
</bag> 
+0

我在此解决方案中修复了列名称属性。请看一看。 – rgrano

+0

没有工作,当我添加这些,trohw错误“无法编译映射文档”在“colum”标签的行中,但我使用无论如何不工作:( – user2547522

+0

从“id”标记中取出“column =”Id“并添加它如下 rgrano

相关问题