c#

EF 4.1 Cascade

1

Olá pessoal,  dessa vez o assunto será a configuração de deleção em cascata do EntityFramework 4.1. A motivação para criar o post foi a dúvida de alguns amigos no twitter, enquanto o time do EF  não libera novidades pretendo escrever posts baseados nas dúvidas da galera, então vamos ao cascade.

1-Entidades

2-Contexto

A configuração da primeira entidade define um relacionamento um para n(hasmany() e withRequired()) e habilita a deleção em cascata

3-Exemplos

Dica

A configuração da deleção em cascata usando WillCascadeOnDelete() é dependente da configuração do relacionamento, é possível configurar o relacionamento de diferentes maneiras, caso o cascade não funciona a dica é rever a configuração de chaves estrangeiras e relacionamentos.

 

Download código fonte

equals é diferente de ==

2

Semana passada tive de resolver um bug e o problema era na comparação de objetos, será que usar obj1.Equals(obj2) é a mesma coisa que obj1==obj2 ?Considere o exemplo:

   1: string name = default(String);

   2: string nickName = default(String);

 

Exemplo 1:

   1: if (name != nickName)

   2:     Console.WriteLine("Diferentes");

 

Exemplo 2:

   1: if (!name.Equals(nickName))

   2:     Console.WriteLine("Diferentes");

Exemplo 3:

   1: if (!nickName.Equals(name))

   2:     Console.WriteLine("Diferentes");

 

Qual o resultado? é a mesma coisa?

Usando funções C# no XML

0

Olá pessoal, vamos ver como utilizar funções definidas em C# dentro de documentos XSLT.

Considere o simples xml abaixo:

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

   2: <entities>

   3:   <entity>

   4:     <name value="Carlos"></name>

   5:   </entity>

   6: </entities>

 

Temos o seguinte XSLT com algumas chamas a funções:

   1: <xsl:stylesheet version="2.0"

   2:   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

   3:   xmlns:fo="http://www.w3.org/1999/XSL/Format"

   4:   xmlns:xhtml="http://www.w3.org/1999/xhtml"

   5:   xmlns:xslFunctions="urn:MyXslExtensions"

   6: >

   7:   <xsl:template match="entities/entity">

   8:     <xsl:value-of select ="xslFunctions:WriteMyContent()"/>

   9:     -

  10:     <xsl:value-of select ="xslFunctions:WriteEntityName(.)"/>

  11:   </xsl:template>

  12:  

  13: </xsl:stylesheet>

 

Logo no cabeçalho podemos reparar uma nova definição:

   1: xmlns:xslFunctions="urn:MyXslExtensions"

Aqui estou definindo um novo namespace de nome xslFunctions e defino que ele será encontrado na urn:urn:MyXslExtensions

O arquivo MyXslExtensions está no mesmo namespace mas vocês vão ver que poderia estar em qualquer outro, segue a definição do arquivo:

   1: namespace XmlExtensionsUsingCSharp

   2: {

   3:     public class MyXslExtensions

   4:     {

   5:         public String WriteMyContent()

   6:         {

   7:             return "MyXslExtensionstext";

   8:         }

   9:         public String WriteEntityName(System.Xml.XPath.XPathNodeIterator node)

  10:         {

  11:             var entityElements = node.Current.SelectChildren("name", "").GetEnumerator();

  12:             String text = String.Empty;

  13:             while (entityElements.MoveNext())

  14:             {

  15:                 text += (entityElements.Current as XPathNavigator).GetAttribute("value", "");

  16:             }

  17:             return text;

  18:         }

  19:     }

  20: }

 

   1: XslTransform xsl = new XslTransform();

   2:  

   3:           //passando caminho do xslt

   4:           xsl.Load(AppDomain.CurrentDomain.BaseDirectory + "XsltFile.xslt");

   5:  

   6:           System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();

   7:  

   8:           XmlWriter xmlWriter = new XmlTextWriter(memoryStream, System.Text.Encoding.Default);

   9:  

  10:           //Carregando as extensões customizadas

  11:           XsltArgumentList xsltArgumentList = new XsltArgumentList();

  12:           //adiciono uma extensão com a mesma urn definida no xslt

  13:           xsltArgumentList.AddExtensionObject("urn:MyXslExtensions", new MyXslExtensions());

  14:  

  15:           //Inicio a transformação

  16:  

  17:           XmlDocument xmlDocument = new XmlDocument();

  18:           xmlDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "XMLFile1.xml");

  19:           xsl.Transform(xmlDocument, xsltArgumentList, xmlWriter, null);

  20:  

  21:           Byte[] buffer = new Byte[memoryStream.Length];

  22:           buffer = memoryStream.ToArray();

  23:           String content = System.Text.Encoding.Default.GetString(buffer);

  24:           lblValue.Text = content;

 

Voltando ao xslt podemos ver as chamadas para as funções customizadas:

   1: <xsl:value-of select ="xslFunctions:WriteMyContent()"/>

Apenas executamos uma função que retorna uma string

 

   1: <xsl:value-of select ="xslFunctions:WriteEntityName(.)"/>

Executamos uma função que recebe o nó corrente como parâmetro e navega no mesmo usando Xpath para obter o atributo value do elemento name que é filho do elemento entity(elemento corrente no momento da execução)

Gerando código com templates T4 – Parte IGenerating code with T4 templates – Part I

0

Hoje muito se ouve na comunidade .NET sobre templates T4.Não vou entrar no mérito de falar o que é pois vários blogs já o fizeram, você pode obter referências aqui, aqui e aqui. Eu mostrar um exemplo de como podemos gerar código sem conhecer muito do T4.

A ferramenta que vou usar é o VS2010 beta 2 com o add-on tangible t4 editor que pode ser baixado diretamente do visual studio.Para iniciar vamos criar uma solução clas library e adicionar um arquivo chamado

No exemplo abaixo vamos criar uma classe com o crud de uma entidade chamada pessoa. vamos usar LINQTOSQL para facilitar o exemplo.

EntidadePessoa

Após criar o banco com a tabela pessoa vamos adicionar um arquivo t4 chamado crud.tt .

vs2010:Selecionar  a opção general nos tipos de arquivos e selecionar o arquivo text template.

vs2008:Adicionar um arquivo com extensão .tt.

1-Vamos começar alterando a opção extension na tag  output, vamos colocar .cs.

2- declarar variáveis para armazenar os dados que serão utilizados várias vezes pelo template

<# var NomeDaClasse = “Pessoa”;
var NomeDoDataContext = “db”;
#>

3- Adicionar os namespaces que serão utilizados pelo nosso CRUD

using System;

using System.Collections.Generic;

using System.Linq;

4- Declarar a classe responsável pelo CRUD

public class <#=NomeDaClasse#>CRUD {}
5- podemos salvar o arquivo e ver como nosso .cs está ficando
6-vamos declarar o nosso dataContext e criar um construtor para inicializá-lo
<#=NomeDoDataContext#> db;
public <#=NomeDaClasse#>CRUD()
{
db = new <#=NomeDoDataContext#>();
}
No meu arquivo .cs o DataContext não ficou “colorido”, vou colocar o namespace da minha classe
namespace BlogT4
{
public class <#=NomeDaClasse#>CRUD
{
<#=NomeDoDataContext#> db;
public <#=NomeDaClasse#>CRUD()
{
db = new <#=NomeDoDataContext#>();
}
}
}
7- vamos adicionar nosso primeiro método, será o inserir.
public void Inserir(<#=NomeDaClasse#> entidade)
{
db.<#=NomeDaClasse#>s.InsertOnSubmit(entidade);
db.SubmitChanges();
}
O código acima está completamente amarrado com o LINQTOSQL, vamos manter assim para facilitar o exemplo. Acho que agora você já sabe criar o deletar e atualizar certo? então vou criar um método que retorna todas as pessoas
8- criando um método que retorna todas as entidades
public IQueryable<<#=NomeDaClasse#>> RecuperaTodasAsPessoas()
{
return db.<#=NomeDaClasse#>s;
}

Galera, já temos nosso código CRUD básico, para gerar o mesmo código para outra classe basta mudar a variável NomeDaClasse e pronto!


   1: using System;

   2: using System.Collections.Generic;

   3: using System.Linq;

   4:

   5: namespace BlogT4

   6: {

   7:     public class PessoaCRUD

   8:     {

   9:

  10:         BlogT4DataDataContext db;

  11:

  12:         public PessoaCRUD()

  13:         {

  14:             db = new BlogT4DataDataContext();

  15:         }

  16:

  17:         public void Inserir(Pessoa entidade)

  18:         {

  19:             db.Pessoas.InsertOnSubmit(entidade);

  20:             db.SubmitChanges();

  21:         }

  22:

  23:         public IQueryable<Pessoa> RecuperaTodasAsPessoas()

  24:         {

  25:             return db.Pessoas;

  26:         }

  27:

  28:     }

  29: }

no proximo post sobre T4 vamos melhorar as coisas e gerar código de maneira mais elegante! Até o próximo..

ps: o wordpres+ live writer estão sacaneando minha formatação..

Predicados, diferentes maneiras de obter o mesmo resultado

0

Fala Galera, estava relembrando os diferentes tipos de delegates no .NET  e comecei a escrever diferentes maneiras de obter o mesmo resultado utilizando predicados. segue o código de exemplo:

   1: class Program

   2:    {

   3:        static void Main(string[] args)

   4:        {

   5:            List<Int32> lista = new List<Int32>();

   6:            lista.Add(1);

   7:            lista.Add(10);

   8:            lista.Add(9);

   9:            lista.Add(21);

  10:            lista.Add(4);

  11:            lista.Add(6);

  12:

  13:

  14:            //Diferentes maneiras de retornar todos os valores maiores que 10

  15:

  16:

  17:            Predicate<Int32> predicado1 = MaiorQue10; // setando método que será disparado

  18:            Predicate<Int32> predicado2 = x => { return x > 10; }; //setando método anônimo

  19:

  20:            lista.FindAll(delegate(Int32 valor) { return valor > 10; }); //criando delegate e setando método

  21:            lista.FindAll(x => x > 10);   //setando método anônimo direto

  22:            lista.FindAll(MaiorQue10);   //setando método que será disparado

  23:            lista.FindAll(predicado1);  //setando o predicado

  24:            lista.FindAll(predicado2); //setando o predicado

  25:

  26:        }

  27:

  28:        public static Boolean MaiorQue10(Int32 value)

  29:        {

  30:            return value > 10;

  31:        }

  32:

  33:

  34:

  35:

  36:

  37:

  38:    }

Hi people, I was  remembering the different types of delegates in .NET so I started to write different ways to achieve the  same result using predicates.  Have a look at the code below

   1: class Program

   2:    {

   3:        static void Main(string[] args)

   4:        {

   5:            List<Int32> listaOfValues = new List<Int32>();

   6:            listaOfValues.Add(1);

   7:            listaOfValues.Add(10);

   8:            listaOfValues.Add(9);

   9:            listaOfValues.Add(21);

  10:            listaOfValues.Add(4);

  11:            listaOfValues.Add(6);

  12:

  13:

  14:

  15:

  16:

  17:            Predicate<Int32> predicate1 = GreaterThan10; //setting the method that will be called

  18:            Predicate<Int32> predicate2 = x => { return x > 10; }; //setting anonymous method

  19:

  20:            listaOfValues.FindAll(delegate(Int32 valor) { return valor > 10; }); // creating delegate and setting method

  21:            listaOfValues.FindAll(x => x > 10);   //setting the anonimous method

  22:            listaOfValues.FindAll(GreaterThan10);   //setting the method that will be called

  23:            listaOfValues.FindAll(predicate1);  //setting the predicate

  24:            listaOfValues.FindAll(predicate2); //setting the predicate

  25:

  26:        }

  27:

  28:        public static Boolean GreaterThan10(Int32 value)

  29:        {

  30:            return value > 10;

  31:        }

  32:

  33:

  34:

  35:

  36:

  37:

  38:    }

Métodos de extensão, adicionando código a interfaces

0

Fala Galera, não sei se fui muito pragmatico durante o aprendizado das novidades do C# 3.0 ou se apenas não fiz uso de boas fontes de informação. O fato é que eu não sabia do real poder dos  métodos de extensão, eles podem ser adicionados a interfaces. Sendo assim é possível realizar aquele sonho de criar um código comum sem “gastar” a herança e sem o “overload” da delegação.

Eu sempre ficava confuso com relação a criação de métodos de extensão e métodos de instancia, agora sei um bom motivo para fazer a distinção. Ainda fiquei sabendo que grande parte dos métodos que usamos do LINQ foram adicionados a interfaces, como exemplo temos os métodos de IQueryable.  sabendo disso, segue o código de exemplo:

   1: class Program

   2: {

   3:     static void Main(string[] args)

   4:     {

   5:         IAutomovel automovel = new Carro();

   6:         automovel.Acelerar();

   7:

   8:         Console.ReadKey();

   9:     }

  10: }

  11:

  12:

  13: public static class ExtensionAdditions

  14: {

  15:     public static void Acelerar(this IAutomovel automovel)

  16:     {

  17:         //acelerando

  18:         Console.WriteLine("Acelerando");

  19:     }

  20: }

  21:

  22: public interface IAutomovel

  23: {

  24: }

  25:

  26: public class Carro : IAutomovel

  27: {

  28:

  29: }

  30:

  31: public class Moto : IAutomovel

  32: {

  33:

  34: }

Hello fellas, I don’t know if I  was too pragmatic while I was learning about the new features of C# 3.0 or If I just didn’t find  the best resources to learn. The fact is that until I read this book I didn’t know about the real power of extension methods, they can be added to interfaces. Therefore is possible to satisfy the old desire of develop some “generic” code without “spend” inheritance and don’t have some tasks making delegation.

Every time I had to create an extensions method, I was confuse about the difference between extension methods and objects methods. Now I can say that I’ve a good reason to make some distinction about them. In addition to it I learnt that almost all methods I’ve been using when working with LINQTOSQL were made using this kind of code. So,  lets have a look at this example:

   1: class Program

   2: {

   3:     static void Main(string[] args)

   4:     {

   5:         IVehicle vehicle = new Car();

   6:         vehicle.Accelerate();

   7:

   8:         Console.ReadKey();

   9:     }

  10: }

  11:

  12:

  13: public static class ExtensionAdditions

  14: {

  15:     public static void Accelerate(this IVehicle automovel)

  16:     {

  17:         //acelerando

  18:         Console.WriteLine("increasing speed");

  19:     }

  20: }

  21:

  22: public interface IVehicle

  23: {

  24: }

  25:

  26: public class Car : IVehicle

  27: {

  28:

  29: }

  30:

  31: public class motorcycle : IVehicle

  32: {

  33:

  34: }

So friends I hope it helps!

Release 0.3 do gateway de pagamento locaweb

2

Fala Galera, finalmente liberei o release 0.3 da API de integração com o gateway de pagamento locaweb. Este release contém muitas novidades. Acho que a principal novidade foi a  reformulação da solução para suportar vários módulos de pagamento.Além disso este release apresenta os seguintes módulos homologados

  • VISAVBV
  • REDECARD

Além da homologação diversas melhorias na solução foram realizadas, as melhorias notáveis foram:

  • comentários nas funções
  • construção inicial da documentação
  • controle mais eficiente da visibilidade dos componentes
  • maior organização dos componentes em pastas e namespaces

O release 0.4 deve conter melhorias no código e liberação de todas as formas básicas de pagamento(VISA,REDECARD,AMEX) , além da criação da documentação para cada módulo.

links:

projeto no codeplex

link de download

dicas,dúvidas e etc

formas homologadas

ico_visa_big_white ico_mastercard_bigico_dinners_big

ps: source code is available only in portugueseHello folks,  I’ve just released the version 0.3 of API de integração com o gateway de pagamento locaweb. It was about time, I’ve been working in this release since wo weeks ago, just today I could release it.  I’ve to teel that this release contains a lot of things that have not been planned so I spend more time on these additions. I think that the most valuable addition is that now the solution supports more than one module, so now It can has  some others implementations for example Oi paggo.Besides this technical change these following modules  were released:

  • VISAVBV
  • REDECARD

The mains improvements in this solution were:

  • All methods were docummented with its own comment
  • Initial production of general documentation
  • improvements in the scope of components
  • Creation of namespaces and foldes to improve the solution

The release 0.4 contains some code  improvements and all basic payment methods(VISA,REDECARD,AMEX) besides the documentation for each module

links:

project in codeplex

link to download

tips,doubts ans sth else

available methods

ico_visa_big_white ico_mastercard_bigico_dinners_big

usando friend assembly .NET

0

Fala Galera, estava trabalhando na API de gateway de pagamento e me encontrei na seguinte situação: Estou construindo uma DLL(Class Library)  e gostaria de testar alguns métodos desta API no meu projeto de Testes. O problema está na visibilidade dos elementos, minha API tem a maioria das classes declaradas como internal. Logo não são acessíveis em outros assemblies, a não ser que você utiliza o conceito de Friend Assembly.

Friend assembly, como o nome já diz consiste em declarar um assembly como amigo, um assembly amigo tem acesso as classes declaradas como internal. Para fazer isso é muito simples, segue o código abaixo de exemplo que deve ser acessado por outro assembly

   1: using System.Runtime.CompilerServices;

   2:

   3: [assembly: InternalsVisibleTo("ConsoleApplication")]

   4:

   5: namespace ClassLibrary

   6: {

   7:     internal class SampleClass

   8:     {

   9:

  10:         public void DoSomething()

  11:         {

  12:             // Do Something

  13:         }

  14:     }

  15: }

A diretiva assembly:InternalVisibleTo indica qual o nome do assembly que pode acessar as classes internas.

Pesquisei pouco mais vi que existem muitas soluções para fazer isso, algumas usando reflexão e  outras simples como esta apresentada. No meu caso fiquei com essa pela facilidade de implementar. está ai a dica, se um dia passar pelo mesmo problema.. Boa semana!Hello Folks, I was working in my new OpenSource project, API de gateway de pagamento da locaweb, when I had to solve one problem. In this project I have a class library and I’m writing some unit tests in another project called tests. The problem is when I try to access some internal class defined in the API library. These classes aren’t accessible, so I came up with to use friend assembly.

Friend assembly, is a kind of relationship that you can create between assemblies, one of related assemblies has access to internal methods of the related assembly. make this configuration is really easy, look the code below

   1: using System.Runtime.CompilerServices;

   2:

   3: [assembly: InternalsVisibleTo("ConsoleApplication")]

   4:

   5: namespace ClassLibrary

   6: {

   7:     internal class SampleClass

   8:     {

   9:

  10:         public void DoSomething()

  11:         {

  12:             // Do Something

  13:         }

  14:     }

  15: }

The directive assembly:InternalVisibleTo indicates which of your assemblies can access the internal classes.

When I was looking for information I found that there are lot solutions to problems like this one I related. I chose this solution ‘cause it is simple one I found. I hope this helps

C#, Criando alias para generics

1

Fala Galera, estou lendo o livro More Effective c#, 50 ways to improve your c# e aprendi uma técnica legal, Usar alias para tipos genéricos. Olhe o exemplo abaixo e veja como é mais elegante usar alias

   1: /// <summary>

   2: /// Tipo Genérico usado para demonstração

   3: /// </summary>

   4: /// <typeparam name="T"></typeparam>

   5: /// <typeparam name="T2"></typeparam>

   6: public class TipoGenerico<T, T2>

   7: {

   8:     private T param1;

   9:     public T Param1

  10:     {

  11:         get { return param1; }

  12:         set { param1 = value; }

  13:     }

  14:  

  15:  

  16:     private T2 param2;

  17:     public T2 Param2

  18:     {

  19:         get { return param2; }

  20:         set { param2 = value; }

  21:     }

  22:  

  23:     public TipoGenerico(T param, T2 param2)

  24:     {

  25:         this.param1 = param;

  26:         this.param2 = param2;

  27:     }

  28: }

Agora segue o exemplo normal de instanciação:

   1: static void Main(string[] args)

   2: {

   3:       TipoGenerico<String, Decimal> exemploUsandoAlias = new TipoGenerico<String, Decimal>("", 1);

   4: }

Exemplo usando alias:

   1: using AliasTipoGenerico = TipoGenerico<String, Decimal>; // Criando um alias para meu generic

   2: class Program

   3: {

   4:  

   5:     static void Main(string[] args)

   6:     {

   7:  

   8:         AliasTipoGenerico exemploUsandoAlias = new AliasTipoGenerico("", 1);

   9:     }

  10: }

Gostou? considerando que se você espalha instanciação deste tipo pelo sistema a coisa pode ser ainda mais complicada achei o recurso legal.. certamente vou usar :)

Constantes X ReadOnly

1

Fala Galera, no ultimo post que fiz um amigo leitor fez uma observação sobre o seguinte código

Ele falou que sobre Variáveis ReadOnly e static, assim que vi o comentário fiquei pensando no motivo para usar um ou outro, logo fui buscar alguma coisa e achei alguns esclarecimentos. A primeira coisa que achei legal é uma tabela comparativa:

Const

  • Não pode ser declarada como estática
  • Possui natureza estática
  • Valor Obtido em tempo de compilação
  • Inicializada somente na declaração
  • Deve ser inicializada com um valor literal
  • Pode ser usada em um comando Switch

ReadOnly

  • Pode ser de instancia ou estática
  • Valor obtido em execução
  • Pode ser inicializada na declaração ou em outros códigos como construtores
  • Pode ser inicializada com uma expressão

No meu exemplo de código ele poderia ser static readOnly, mas eu conheço o valor em tempo de programação, logo não tenho necessidade de usar readOnly, além disso tenho o valor da variável em compilação, menos uma coisa pra execução. Ainda procurei o motivo pelo qual const não podem ser declaradas como static, a explicação que encontrei foi que uma confusão poderia ser gerada pois lendo um código como o seguinte

O programador pode achar que const é um tipo específico de static, além da declaração ficar “feia”.

Fontes:

http://stackoverflow.com/questions/842609/why-does-c-not-allow-const-and-static-on-the-same-line
http://stackoverflow.com/questions/842590/static-constants-in-c

http://www.dotnetspider.com/forum/161710-How-declare-constant-variable-C.aspx

http://weblogs.asp.net/psteele/archive/2004/01/27/63416.aspx

http://en.csharp-online.net/const,_static_and_readonly

http://msdn.microsoft.com/en-us/library/ms173119.aspx

Go to Top