What implementation would I use to initialize the data in the database using 1:N relationship?

Asked

Viewed 71 times

0

My intention is to initialize a SubCategoria, but she needs a Categoria first (1:N). I wanted to know which implementation I would use to make this relationship work to boot into the database? I’m using the method Seed entityframework.

Method Seed

protected override void Seed(Context context)
        {
            IList<Categoria> CategoriasInicialização = new List<Categoria>();
            IList<UnidadeDeMedida> UndMedidasInicialização = new List<UnidadeDeMedida>();
            IList<SubCategoria> SubCategoriaInicialização = new List<SubCategoria>();

            #region Inicialização das SubCategorias

            SubCategoriaInicialização.Add(new SubCategoria() { SubCategoriaNome = "Controlados" });

            foreach (var subCategorias in SubCategoriaInicialização)
                context.SubCategorias.Add(subCategorias);

            #endregion

            #region Inicialização das Categorias

            CategoriasInicialização.Add(new Categoria() { CategoriaNome = "Medicamentos" });
            CategoriasInicialização.Add(new Categoria() { CategoriaNome = "Generos Alimenticios" });
            CategoriasInicialização.Add(new Categoria() { CategoriaNome = "Materiais de Construção" });
            CategoriasInicialização.Add(new Categoria() { CategoriaNome = "Materiais Hospitalar" });
            CategoriasInicialização.Add(new Categoria() { CategoriaNome = "Materiais Odontologico" });

            foreach (var categorias in CategoriasInicialização)
                context.Categorias.Add(categorias);

            context.SaveChanges();
            base.Seed(context);
}

Mapping class of Subcategory

public SubCategoriaConfig()
        {
            ToTable("SubCategoria");
            HasKey(c => c.SubCategoriaId);

            Property(x => x.SubCategoriaNome)
                .IsRequired()
                .HasMaxLength(60);

            HasRequired(x => x.Categoria)
                .WithMany(x => x.SubCategorias)
                .Map(m => m.MapKey("CategoriaId"));
        }
  • 1

    You added context.Savechanges(); before base. Seed(context);

  • @Juniorporpirio Thanks for your reply. I really forgot to copy and paste the method context.SaveChanges(), but I already did. I was thinking about doing that (I’m a beginner, okay?!): CategoriasInicialização.Add(new Categoria() { CategoriaNome = "Medicamentos", SubCategorias = SubCategoriaInicialização });

  • @There’s another elegant way to do it?

  • In the Model Category there are several Subcategories ?

  • @Correct Juniorphyrian.

  • I made it simpler, take a look to see if I got it right.

Show 1 more comment

1 answer

1


If I understood your models correctly, it would be something so simple:

var categorias= new List<Categoria>{
                         new Categoria{ CategoriaNome = "Medicamentos" },
                         new Categoria{ CategoriaNome = "Generos Alimenticios" },
                         new Categoria{ CategoriaNome = "Materiais de Construção" },
                         new Categoria{ CategoriaNome = "Materiais Hospitalar" },
                         new Categoria{ CategoriaNome = "Materiais Odontologico" }
};

    categorias.ForEach(x=> context.Categorias.Add(x));
    context.SaveChanges();


    var subCategorias= new List<SubCategoria>{
            new SubCategoria{ SubCategoriaNome = "Controlados", Categoria= categorias.FirstOrDefault(s => s.CategoriaNome.Equals("Medicamentos") },
            new SubCategoria{ SubCategoriaNome = "Controlados 2", Categoria= categorias.FirstOrDefault(s => s.CategoriaNome.Equals("Medicamentos") }
    };

        subCategorias.ForEach(s => context.SubCategoria.Add(s));
        context.SaveChanges();

      categorias[0].SubCategorias.Add(subcategorias[0]); 
      categorias[0].SubCategorias.Add(subcategorias[1]);

      context.SaveChanges();
  • I liked its implementation. Mainly lambda expressions. I will use something similar! Thank you!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.