當我嘗試使用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之前添加到了一起,然後我將那個映射放到那裏並開始出現此錯誤。
從Pessoa ...順便說一句,當我試圖插入一個新的佩索阿,儘管類型,與repo.Inserir(p);,例如,錯誤發生。 – Alaor 2009-09-25 20:29:33
哦,對不起,現在我明白了,遺失了遺產,哦,上帝!多可惜! – Alaor 2009-09-25 20:30:13
接受了答案,真的非常感謝你,一些小時的代碼可以讓你失明,謝謝你的光! – Alaor 2009-09-25 20:33:30