Nhibernate错误使X的属性值脱水

时间:2016-05-30 02:14:07

标签: c# nhibernate

我在保存具有关联的实体时遇到问题。下面是我的代码,它给出了错误:

  

"使属性值脱水错误   Data.Entities.Pessoa_fisica.NOME_PAI"

如果有人帮助我,我会很高兴的!提前谢谢!

        public class Pessoa_fisica
        {
            public virtual int ID { get; set; }
            public virtual Pessoa Pessoa { get; set; }
            public virtual Estado_civil Estado_civil { get; set; }
            public virtual string CPF { get; set; }
            public virtual string RG { get; set; }
            public virtual string ORGAO_RG { get; set; }
            public virtual DateTime DATA_EMISSAO_RG { get; set; }
            public virtual DateTime DATA_NASCIMENTO { get; set; }
            public virtual string SEXO { get; set; }
            public virtual string NATURALIDADE { get; set; }
            public virtual string NACIONALIDADE { get; set; }
            public virtual string RACA { get; set; }
            public virtual string TIPO_SANGUE { get; set; }
            public virtual string CNH_NUMERO { get; set; }
            public virtual string CNH_CATEGORIA { get; set; }
            public virtual DateTime CNH_VENCIMENTO { get; set; }
            public virtual string TITULO_ELEITORAL_NUMERO { get; set; }
            public virtual int TITULO_ELEITORAL_SECAO { get; set; }
            public virtual string RESERVISTA_NUMERO { get; set; }
            public virtual int RESERVISTA_CATEGORIA { get; set; }
            public virtual int TITULO_ELEITORAL_ZONA { get; set; }
            public virtual string NOME_MAE { get; set; }
            public virtual string NOME_PAI { get; set; }
        }

        public class Pessoa
        {
            public virtual int ID { get; set; }
            public virtual IList<Pessoa_fisica> PessoasFisicas { get; set; }
            public virtual string NOME { get; set; }
            public virtual string TIPO { get; set; }
            public virtual string EMAIL { get; set; }
            public virtual string SITE { get; set; }
            public virtual string CLIENTE { get; set; }
            public virtual string FORNECEDOR { get; set; }
            public virtual string COLABORADOR { get; set; }
            public virtual string CONVENIO { get; set; }
            public virtual string CONTADOR { get; set; }
            public virtual string TRANSPORTADORA { get; set; }
        }

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

        <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="Data" namespace="Data.Entities">
          <class name="Pessoa" table="pessoa" dynamic-update="true" >
            <cache usage="read-write"/>
            <id name="ID" column="ID" type="int">
              <generator class="native" />
            </id>
            <bag name="PessoasFisicas"
                 lazy="true"
                 inverse="true"
                 batch-size="25"
                 cascade="save-update">
              <key column="ID" />
              <one-to-many class="Pessoa_fisica" />
            </bag>
            <property name="NOME" />
            <property name="TIPO" />
            <property name="EMAIL" />
            <property name="SITE" />
            <property name="CLIENTE" />
            <property name="FORNECEDOR" />
            <property name="COLABORADOR" />
            <property name="CONVENIO" />
            <property name="CONTADOR" />
            <property name="TRANSPORTADORA" />
          </class>
        </hibernate-mapping>

      <?xml version="1.0" encoding="utf-8" ?>
        <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="Data" namespace="Data.Entities">
          <class name="Pessoa_fisica" table="pessoa_fisica" dynamic-update="true" >
            <cache usage="read-write"/>
            <id name="ID" column="ID" type="int">
              <generator class="native" />
            </id>
            <many-to-one not-null="true" name="Pessoa" column="ID" />
            <many-to-one not-null="false" name="Estado_civil" column="ID" />

            <property name="CPF" />
            <property name="RG" />
            <property name="ORGAO_RG" />
            <property name="DATA_EMISSAO_RG" />
            <property name="DATA_NASCIMENTO" />
            <property name="SEXO" />
            <property name="NATURALIDADE" />
            <property name="NACIONALIDADE" />
            <property name="RACA" />
            <property name="TIPO_SANGUE" />
            <property name="CNH_NUMERO" />
            <property name="CNH_CATEGORIA" />
            <property name="CNH_VENCIMENTO" />
            <property name="TITULO_ELEITORAL_NUMERO" />
            <property name="TITULO_ELEITORAL_SECAO" />
            <property name="RESERVISTA_NUMERO" />
            <property name="TITULO_ELEITORAL_ZONA" />
            <property name="RESERVISTA_CATEGORIA" />
            <property name="NOME_MAE" />
            <property name="NOME_PAI" />
          </class>
        </hibernate-mapping>

if (ModelState.IsValid)
            {
                ISession session = Data.Entities.NHIbernateSession.OpenSession();
                ITransaction tx = session.BeginTransaction();
                Data.Entities.Pessoa objPessoa = new Data.Entities.Pessoa();
                Data.Entities.Pessoa_fisica objPessoaFisica = new Data.Entities.Pessoa_fisica();
                objPessoaFisica.Pessoa = new Data.Entities.Pessoa();

                objPessoa.TIPO = "F";
                objPessoa.NOME = pessoa.Nome;
                objPessoa.EMAIL = pessoa.Email;
                objPessoa.SITE = pessoa.Site;
                objPessoa.CLIENTE = pessoa.Cliente ? "S" : "N";
                objPessoa.FORNECEDOR = pessoa.Cliente ? "S" : "N";
                objPessoa.COLABORADOR = pessoa.Cliente ? "S" : "N";
                objPessoa.CONVENIO = pessoa.Cliente ? "S" : "N";
                objPessoa.CONTADOR = pessoa.Cliente ? "S" : "N";
                objPessoa.TRANSPORTADORA = pessoa.Cliente ? "S" : "N";

                objPessoaFisica.Pessoa = objPessoa;
                objPessoaFisica.CPF = pessoa.CPF.Replace(".", "").Replace("-", "");
                objPessoaFisica.DATA_NASCIMENTO = Convert.ToDateTime(pessoa.Nascimento);
                objPessoaFisica.Estado_civil = session.Query<Data.Entities.Estado_civil>().Where(c => c.ID == pessoa.EstadoCivil).First();
                objPessoaFisica.RACA = pessoa.Raca;
                objPessoaFisica.TIPO_SANGUE = pessoa.TipoSanguineo;
                objPessoaFisica.NACIONALIDADE = pessoa.Nacionalidade;
                objPessoaFisica.NATURALIDADE = pessoa.Naturalidade;
                objPessoaFisica.NOME_PAI = pessoa.NomePai;
                objPessoaFisica.NOME_MAE = pessoa.NomeMae;
                objPessoaFisica.RG = pessoa.RG.Replace(".", "");
                objPessoaFisica.DATA_EMISSAO_RG = Convert.ToDateTime(pessoa.EmissaoRG);
                objPessoaFisica.ORGAO_RG = pessoa.OrgaoEmissor;
                objPessoaFisica.RESERVISTA_NUMERO = pessoa.NumeroReservista;
                objPessoaFisica.RESERVISTA_CATEGORIA = Convert.ToInt32(pessoa.ReservistaCategoria);
                objPessoaFisica.SEXO = pessoa.Sexo;
                objPessoaFisica.CNH_NUMERO = pessoa.NumeroCnh;
                objPessoaFisica.CNH_VENCIMENTO = Convert.ToDateTime(pessoa.VencimentoCnh);
                objPessoaFisica.CNH_CATEGORIA = pessoa.CategoriaCnh;
                objPessoaFisica.TITULO_ELEITORAL_NUMERO = pessoa.NumeroTitulo;
                objPessoaFisica.TITULO_ELEITORAL_ZONA = Convert.ToInt16(pessoa.Zona);
                objPessoaFisica.TITULO_ELEITORAL_SECAO = Convert.ToInt16(pessoa.Secao);
                objPessoa.PessoasFisicas = new List<Data.Entities.Pessoa_fisica>();
                objPessoa.PessoasFisicas.Add(objPessoaFisica);

                session.SaveOrUpdate(objPessoa);
                session.Flush();
                session.Clear();
                tx.Commit();

                return RedirectToAction("New", "PessoaFisica");

2 个答案:

答案 0 :(得分:0)

我不知道这是否会导致您描述的问题,但这至少是错误的:

<many-to-one not-null="true" name="Pessoa" column="ID" />
<many-to-one not-null="false" name="Estado_civil" column="ID" />

多对一是声明它的表中的外键,指向引用的表。所以外键&#34; ID&#34;在表pessoa_fisica中声明了两次。 (它可以通过NH合并为一个,导致列数错误,并导致最后一列的错误,即NOME_PAI。只是一个理论。)

将其更改为:

<many-to-one not-null="true" name="Pessoa" column="Pessoa_FK" />
<many-to-one not-null="false" name="Estado_civil" column="Estado_civil_FK" />

不要忘记更新相关的包:

        <bag name="PessoasFisicas"
             lazy="true"
             inverse="true"
             batch-size="25"
             cascade="save-update">
          <key column="Pessoa_FK" />
          <one-to-many class="Pessoa_fisica" />
        </bag>

答案 1 :(得分:0)

在我的情况下,有两个同名的属性。

例: 班级人员 { 字符串FirstName, 字符串LastName, 字符串电子邮件, 联系ContactInfo }

班级联系 { string PhoneNumber, 字符串电子邮件 }

要解决此问题,我必须从Person类中删除电子邮件。

注意:联系人是一个组件。当它在另一个类中用作属性时,如在Person类中,它的属性将成为Person表上的列。请参阅下面的人员表。

人员表:从人员类中删除电子邮件后。

姓 姓 电话号码 电子邮件