2
respostas

Duvida sobre implementação de relacionamento N:N utilizando C#

Estou tendo que fazer um relacionamento entre classes N:N porém armazenando objetos em memória, segue o seguinte relacionamento:

inserir a descrição da imagem aqui

Fiz a implementação da seguinte maneira e gostaria de saber se está correto ou não.

Classe Chemical

    public class Chemical
    {

        public int ID { get; set; }
        public string ChemicalName { get; set; }
        public string ChemicalFormula { get; set; }
        public Decimal MW { get; set; }
        public int VFId { get; set; } // Visual_Flow_ID
        public Boolean ProjectChemical { get; set; }

        public Chemical()
        {

        }

Classe Stream.

public class Stream
    {
        public int ID { get; set; }
        public string Name { get; set; }

        public virtual IList<StreamComposition> Chemicals { get; set; }

        public Stream()
        {
            this.Chemicals = new List<StreamComposition>();
        }

        public void AddChemical(StreamComposition sc)
        {
            this.Chemicals.Add(sc);
            Console.WriteLine("Adding Chemical: " + sc.Chemical.ChemicalName + 
                " to the Stream: => " + sc.Stream.Name + "\n");
        }
    }

Classe StreamComposition

public class StreamComposition
    {
        public virtual Stream Stream { get; set; }

        public virtual Chemical Chemical { get; set; }

        public Decimal MolePerCent { get; set; }

        public StreamComposition()
        {
        }
    }

Populando os objetos

Criação da Stream

Stream Stream1 = new Stream() { ID = 1, Name = "SHD4", };

Criação dos 3 objetos 'Chemicals'

Chemical ch1 = new Chemical() // Criando uma 'Chemical'
                    {
                        ID = 1,
                        ChemicalName = "Hidrogenio",
                        ChemicalFormula = "H",
                        MW = 2,
                        VFId = 2,
                        ProjectChemical = true
                    }; 

Chemical ch2 = new Chemical() // Criando outra 'Chemical'
                {
                    ID = 2,
                    ChemicalName = "Ferro",
                    ChemicalFormula = "Fe",
                    MW = 4,
                    VFId = 8,
                    ProjectChemical = false,
                };

Chemical ch3 = new Chemical()
                {
                    ID = 3,
                    ChemicalName = "Agua",
                    ChemicalFormula = "H20",
                    MW = 9,
                    VFId = 10,
                    ProjectChemical = true,
                };

Criação das 3 classes associativas

StreamComposition sc1 = new StreamComposition() // Criando StreamComposition
                {
                    Stream = Stream1,
                    Chemical = ch1,
                    MolePerCent = 4.0m,
                };

    StreamComposition sc2 = new StreamComposition() // Criando StreamComposition
                {
                    Stream = Stream1,
                    Chemical = ch2,
                    MolePerCent = 8.0m,
                };

    StreamComposition sc3 = new StreamComposition() // Criando StreamComposition
                {
                    Stream = Stream1,
                    Chemical = ch3,
                    MolePerCent = 8.0m,
                };

Atribuindo as Chemicals criada para a Stream 'Stream1'

                Stream1.AddChemical(sc1);
                Stream1.AddChemical(sc2);
                Stream1.AddChemical(sc3);
2 respostas

Acho que fez todo sentido! Uma coisa que você pode fazer é adicionar o método adiciona na classe Stream recebendo um Chemical. Desse jeito você encapsula certinho a criação do objeto que representa a cola.

Então, eu tentei fazer isso, mas quando faço um método

public void Adiciona(Chemical ch) {
    //Código
}

da falha de compilação, aparece:

Argument 1: Cannot convert from 'TestingObjectInMemory.Chemical' to 'TestingObjectInMemory.StreamComposition'

fiz uma solução aqui q n deu nenhuma falha de compilação, porém n sei se é o melhor jeito.

public void AddChemical(Chemical ch)
        {
            Chemicals.Add(new StreamComposition { Chemical = ch });
            Console.WriteLine("Adding Chemical: " + ch.ChemicalName +
                "to the Stream: => " + this.Name);
        }