2009-09-25 85 views
1

當我嘗試使用NHibernate的聯合子類將對象添加到數據庫時出現錯誤。這裏是我的代碼:NHibernate joined-subclass錯誤 - 對象與目標類型不匹配

Pessoa.cs

namespace CarvalhoRodrigues.Domain.Cadastro 
{ 
    public class Pessoa 
    { 
     public Pessoa() 
     { 
      this.Endereco = new List<Endereco>(); 
     } 

     public virtual long Id { get; set; } 
     public enum TipoPessoa { Fisica, Juridica } 
     public virtual TipoPessoa Tipo { get; set; } 
     public virtual ICollection<Endereco> Endereco { get; set; } 

    } 
} 

PessoaFisica.cs

namespace CarvalhoRodrigues.Domain.Cadastro 
{ 
    public class PessoaFisica : Pessoa 
    { 
     public virtual string CPF { get; set; } 
     public virtual string Nome { get; set; } 
     public virtual DateTime DataNascimento { get; set; } 
    } 
} 

PessoaJuridica.cs

namespace CarvalhoRodrigues.Domain.Cadastro 
{ 
    public class PessoaJuridica 
    { 
     public virtual string CNPJ { get; set; } 
     public virtual string RazaoSocial { get; set; } 
     public virtual DateTime DataConstituicao { get; set; } 
     public virtual string NomeFantasia { get; set; } 
     public virtual ICollection<Pessoa> Representantes { get; set; } 
    } 
} 

PessoaRepository.cs

namespace CarvalhoRodrigues.Domain.Repositories.Cadastro 
{ 
    class PessoaRepository : IPessoaRepository 
    { 
     public void Inserir(Pessoa Pessoa) 
     { 
      using (ISession session = NHibernateHelper.OpenSession()) 
      { 
       using (ITransaction transaction = session.BeginTransaction()) 
       { 
        session.Save(Pessoa); 
        transaction.Commit(); 
       } 
      } 
     } 
    } 
} 

Pessoa.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="CarvalhoRodrigues.Domain" 
       namespace="CarvalhoRodrigues.Domain.Cadastro"> 

    <class name="Pessoa"> 
    <id name="Id"> 
     <generator class="identity" /> 
    </id> 
    <property name="Tipo" /> 

    <bag name="Endereco" lazy="false"> 
     <key column="PessoaId" /> 
     <one-to-many class="Endereco" /> 
    </bag> 

    <joined-subclass name="PessoaFisica"> 
     <key column="PessoaId" /> 
     <property name="CPF" /> 
     <property name="Nome" /> 
     <property name="DataNascimento" /> 
    </joined-subclass> 

    <joined-subclass name="PessoaJuridica"> 
     <key column="PessoaId" /> 
     <property name="CNPJ" /> 
     <property name="RazaoSocial" /> 
     <property name="DataConstituicao" /> 
     <property name="NomeFantasia" /> 
    </joined-subclass> 

    </class> 

</hibernate-mapping> 

錯誤:

TestCase的 'CarvalhoRodrigues.Tests.GenerateSchema_Fixture.Can_add_pessoa' 失敗:NHibernate.PropertyAccessException:異常發生CarvalhoRodrigues.Domain.Cadastro的吸.Pessoa.Id ----> System.Reflection.TargetException:Objetonãocoincide com o tipo de destino。 EM NHibernate.Properties.BasicPropertyAccessor.BasicGetter.Get(對象目標) EM NHibernate.Engine.UnsavedValueFactory.GetUnsavedIdentifierValue(字符串unsavedValue,IGetter identifierGetter,ITYPE identifierType,ConstructorInfo構造函數) EM NHibernate.Tuple.PropertyFactory.BuildIdentifierProperty(對PersistentClass mappedEntity, IIdentifierGenerator發生器) EM NHibernate.Tuple.Entity.EntityMetamodel..ctor(對PersistentClass對PersistentClass,ISessionFactoryImplementor SessionFactory的) EM NHibernate.Persister.Entity.AbstractEntityPersister..ctor(對PersistentClass對PersistentClass,ICacheConcurrencyStrategy緩存,ISessionFactoryImplementor廠) EM NHibernate.Persister。 Entity.JoinedSubclassEntityPersister.ctor(PersistentClass persistentClass,ICacheConcurrencyStrategy緩存,ISessionFactoryI IMapping映射) em NHibernate.Persister.PersisterFactory.CreateClassPersister(PersistentClass model,ICacheConcurrencyStrategy cache,ISessionFactoryImplementor factory,IMapping cfg) em NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg,IMapping mapping,Settings settings,EventListeners listeners ) EM NHibernate.Cfg.Configuration.BuildSessionFactory() d:\ Projetos \ CarvalhoRodrigues \ CarvalhoRodrigues.Domain \ NhibernateHelper.cs(19,0):EM CarvalhoRodrigues.Domain.NHibernateHelper.get_SessionFactory() d:\ Projetos \ CarvalhoRodrigues \ CarvalhoRodrigues.Domain \ NhibernateHelper.cs(27,0):em CarvalhoRodrigues.Domain.NHibernateHelper.OpenSession() D:\ Projetos \ CarvalhoRodrigues \ CarvalhoRodrigues.Domain \ Repositories \ Cadastro \ PessoaRepository.cs(35,0):em CarvalhoRodrigues.Do main.Repositories.Cadastro.PessoaRepository.Inserir(Pessoa Pessoa) D:\ Projetos \ CarvalhoRodrigues \ CarvalhoRodrigues.Domain \ Tests \ PessoaTests.cs(47,0):em CarvalhoRodrigues.Tests.GenerateSchema_Fixture.Can_add_pessoa() --TargetException em System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target) em System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [] parameters,CultureInfo culture,Boolean skipVisibilityChecks) em System.Reflection.RuntimeMethodInfo .Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []參數,CultureInfo culture) em System.Reflection.RuntimePropertyInfo。的GetValue(對象OBJ,對象[]索引) EM NHibernate.Properties.BasicPropertyAccessor.BasicGetter.Get(目標對象)

「Objeto NAO重合COMöTIPO德DESTINO」 並不意味着 「對象不匹配目標類型」葡萄牙語。我無法弄清楚我做錯了什麼。 完全相同代碼在我將Pessoa.hbm.xml中的第二個連接子類與映射到PessoaJuridica.cs之前添加到了一起,然後我將那個映射放到那裏並開始出現此錯誤。

回答

8

我可能會在這裏跑路,但不應該PessoaJuridica派索從Pessoa或從PessoaFisica派生?

+0

從Pessoa ...順便說一句,當我試圖插入一個新的佩索阿,儘管類型,與repo.Inserir(p);,例如,錯誤發生。 – Alaor 2009-09-25 20:29:33

+0

哦,對不起,現在我明白了,遺失了遺產,哦,上帝!多可惜! – Alaor 2009-09-25 20:30:13

+0

接受了答案,真的非常感謝你,一些小時的代碼可以讓你失明,謝謝你的光! – Alaor 2009-09-25 20:33:30

相關問題