private static Relacionamento CriarLigacaoEntreModels(PropertyInfo propriedade, PropertyInfo propriedadeReferenciada)
        {
            var tipoPropriedade = propriedade.PropertyType;

            if (!propriedade.GetGetMethod().IsVirtual)
            {
                return(null);
            }
            var chaveEstrangeira = DataAnnotationHelper.ConsultarForeignKey(propriedadeReferenciada);

            if (!string.IsNullOrEmpty(chaveEstrangeira))
            {
                return(CriarLigacaoAscendenteEntreModels(propriedadeReferenciada, chaveEstrangeira));
            }
            if (typeof(IEntidade).IsAssignableFrom(tipoPropriedade))
            {
                GerarErroDeLigacao(propriedade);
            }
            var inverse = DataAnnotationHelper.ConsultarForeignKeyDaInverseProperty(propriedadeReferenciada, tipoPropriedade);

            if (!string.IsNullOrEmpty(inverse))
            {
                return(GerarScriptCarregamentoDescendente(propriedadeReferenciada, inverse, tipoPropriedade));
            }
            if ((tipoPropriedade.IsGenericType) && (tipoPropriedade.GetGenericTypeDefinition() == typeof(ICollection <>)))
            {
                GerarErroDeLigacao(propriedade);
            }
            return(null);
        }
        public void SeCriarScriptConsultaRelacionamentoDescendenteDeveGerarUmScriptSqlCorretamente()
        {
            var queryBuilder  = new QueryBuilder();
            var dicionarioPai = new Dicionario(typeof(ObjetoDeTestes));

            queryBuilder.DefinirTabela(dicionarioPai.Nome);
            queryBuilder.AdicionarCondicao("Codigo", (int)Operadores.Igual, 1);
            var scriptConsultaDoPai = queryBuilder.GerarScript(dicionarioPai);

            var dicionarioFilho  = new Dicionario(typeof(FilhoDoObjetoDeTestes));
            var chaveEstrangeira = DataAnnotationHelper.ConsultarForeignKey(dicionarioFilho.ConsultarPorCampo("Pai").Propriedade);

            var relacionamentoBuilder = new RelacionamentoBuilder();
            var relacionamento        = new Relacionamento(TiposRelacionamento.Descendente, dicionarioFilho, chaveEstrangeira);

            relacionamentoBuilder.CriarScriptConsultaRelacionamentoDescendente(relacionamento, scriptConsultaDoPai, dicionarioPai.ConsultarCamposChave())
            .Should()
            .Be("with[d]as(" +
                "select[Codigo],[CodigoNulo],[Nome],[Duplo],[DuploNulo],[Decimal]," +
                "[DecimalNulo],[Logico],[DataHora],[DataHoraNulo] " +
                "from[ObjetoVirtual]" +
                "where([Codigo]=@_p0) " +
                ")" +
                "select[CodigoFilho],[NomeFilho],[CodigoPai]" +
                "from[ObjetoVirtualFilho][t]" +
                "where(exists(" +
                "select top 1 1 " +
                "from[d]" +
                "where(t.[CodigoPai]=d.[Codigo])))");
        }
        public void SeConsultarAForeingKeyDaPropriedadeFilhosDeveRetornarNull()
        {
            var propriedade = typeof(ObjetoDeTestes).GetProperty("Filhos");

            DataAnnotationHelper.ConsultarForeignKey(propriedade)
            .Should().BeNull();
        }
        public void SeConsultarAForeingKeyDaPropriedadPaiDeveRetornarCodigoPai()
        {
            var propriedade = typeof(FilhoDoObjetoDeTestes).GetProperty("Pai");

            DataAnnotationHelper.ConsultarForeignKey(propriedade)
            .Should().Be("IdPai");
        }
        public void SeQuestionarPelaPropriedadeRelacinoadaDeUmObjetoQueNaoPossuiUmaDeterminadaChaveDeveRetornarFalso()
        {
            var filho            = new FilhoDoObjetoDeTestes();
            var dicionario       = new Dicionario(typeof(FilhoDoObjetoDeTestes));
            var chaveEstrangeira = DataAnnotationHelper.ConsultarForeignKey(dicionario.ConsultarPorCampo("Pai").Propriedade);
            var relacionamento   = new Relacionamento(TiposRelacionamento.Ascendente, dicionario, chaveEstrangeira);

            relacionamento.PossuiChaveAscendente(new object[] { 123 }, filho)
            .Should().BeFalse();
        }
        public void SeDefinirUmaChaveAscendenteDeUmCampoRelacionadoDevePreencherObjetoCorretamente()
        {
            var filho            = new FilhoDoObjetoDeTestes();
            var dicionario       = new Dicionario(typeof(FilhoDoObjetoDeTestes));
            var chaveEstrangeira = DataAnnotationHelper.ConsultarForeignKey(dicionario.ConsultarPorCampo("Pai").Propriedade);
            var relacionamento   = new Relacionamento(TiposRelacionamento.Ascendente, dicionario, chaveEstrangeira);

            relacionamento.AplicarChaveAscendente(new object[] { 123 }, filho);

            filho.CodigoPai
            .Should().Be(123);
        }
        public void SeQuestionarPelaPropriedadeRelacionadaComDeterminadoValorPreenchidoDeveRetornarVerdadeiro()
        {
            var filho = new FilhoDoObjetoDeTestes()
            {
                CodigoPai = 123
            };

            var dicionario       = new Dicionario(typeof(FilhoDoObjetoDeTestes));
            var chaveEstrangeira = DataAnnotationHelper.ConsultarForeignKey(dicionario.ConsultarPorCampo("Pai").Propriedade);
            var relacionamento   = new Relacionamento(TiposRelacionamento.Ascendente, dicionario, chaveEstrangeira);

            relacionamento.PossuiChaveAscendente(new object[] { 123 }, filho)
            .Should().BeTrue();
        }