Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Soldado Barbosa

EF 4.0 e ASP.NET MVC 3 como persistir objeto

Recommended Posts

Salve galera.

 

Estou com um problema já faz alguns dias e preciso resolver o quanto antes, na persistência de um objeto que estou colocando em uma Session e recuperando em um controller.

 

Estou desenvolvendo uma aplicação que criar registros de projetos(Projetos.cs), esse projetos possuem tables(Tabelas.cs) e fatores(Fatores.cs) conforme segue abaixo:

 

 

[Projetos.cs]

public class Projetos
   {
       [Key]
       public int idProjeto { get; set; }
       public string NomeProjeto { get; set; }

       public virtual List<Tabelas> Tabelas { get; set; }
       public virtual List<Fatores> Fator { get; set; }
   }

 

 

[Tabelas.cs]

   public class Tabelas
   {
       [Key]
       public int IdTabela { get; set; }
       public string NomeTabela { get; set; }
       public string Descricao { get; set; }
   }

 

 

[Fatores.cs]

   public class Fatores
   {
       [Key]
       public int IdFatores { get; set; }
       public string Nome { get; set; }
       public string Tipo { get; set; }
   }

 

 

Tenho também o meu DbContext:

[sAPFEntities.cs]

   public class SAPFEntities : DbContext
   {
       public DbSet<Projetos> Projetos { get; set; }
       public DbSet<Tabelas> Tabelas { get; set; }
       public DbSet<Funcoes> Funcoes{ get; set; }
   }

 

 

E tenho os meus controlers, o primeiro deles (HomeController) eu faço uma consulta, recupero um objeto, coloco ele na session e redireciono para o controller o Projeto:

 

[HomeController.cs]

   private SAPFEntities db = new SAPFEntities();
   public ActionResult Index(int? id)
   {
       if (id > 0)
       {
           Projetos objProjeto = db.Projetos.Find(id);
           Session["projeto"] = objProjeto;

           return RedirectToAction("Index", "Projeto");
       }

       return View();
   }

 

No controller ProjetoController eu adiciono um objeto Tabela ao objeto Projeto que esta na Session:

 

[ProjetoController.cs]

       private SAPFEntities db = new SAPFEntities();
       public ActionResult Index()
       {

           Projetos objP = (Projetos)Session["Projeto"];
           Projetos objProjeto = db.Projetos.Find(objP.idProjeto);
           objProjeto.Tabelas.Add(new Tabelas {NomeTabela = "Teste", Descricao = "Novo teste"});
           db.SaveChanges();

           Session["projeto"] = objProjeto;

           return RedirectToAction("Abrir");
       }

 

 

A minha dúvida é, existe uma forma mais simples de salvar esse objeto que esta na session? Desta forma a session esta armazenando o objeto e só estou utilizando uma informação desse objeto que é o código para recuperar novamente esse objeto no banco de dados. O que eu gostaria de fazer seria algo semelhante ao que esta abaixo:

       private SAPFEntities db = new SAPFEntities();
       public ActionResult Index()
       {

           Projetos objP = (Projetos)Session["Projeto"];
           objP.Tabelas.Add(new Tabelas {NomeTabela = "Teste", Descricao = "Novo teste"});
           db.SaveChanges();

           return RedirectToAction("Abrir");
       }

 

Já que tenho a referencia do objeto na session, quando eu altero ele aqui toda vez que eu puxar ele da session ele vai estar atualizado e no banco de dados vai estar atualizado, no entanto, mesmo que eu coloque esse código acima na minha aplicação ele vai rodar mas só não vai persistir no banco, por que o objeto "objP" não pertence ao DbContext desse controller (almenos é isso que eu entendo). Esse objeto que esta na session sera utilizado várias vez em outros controller, por isso coloquei ele na Session.

 

Caso isso que eu estou querendo seja impossível, vou alterar a minha aplicação para não utilizar a Session para referenciar o objeto inteiro, referencio somente o código dele e faço consulta ao banco toda véz que eu for utilizar esse cara.

 

 

Desde já agradeço aos colegas pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Soldado, sobre sua dúvida: 'existe uma forma mais simples de salvar esse objeto que esta na session?'.

Sim, no caso da Home redirecionando para Projeto você poderia fazer assim:

 

[HomeController.cs]

private SAPFEntities db = new SAPFEntities();
public ActionResult Index(int? id)
{
  if (id > 0)
  {
     //Projetos objProjeto = db.Projetos.Find(id);
     //Session["projeto"] = objProjeto;

     return RedirectToAction("Index", "Projeto", new { id = id });
   }

   return View();
}

 

E buscar o id no [ProjetoController.cs]

       private SAPFEntities db = new SAPFEntities();
       public ActionResult Index(int? id)
       {
           id = (id ?? 0);

           //Projetos objP = (Projetos)Session["Projeto"];
           //Projetos objProjeto = db.Projetos.Find(objP.idProjeto);
           Projetos objProjeto = db.Projetos.Find(id);
           objProjeto.Tabelas.Add(new Tabelas {NomeTabela = "Teste", Descricao = "Novo teste"});
           db.SaveChanges();

           Session["projeto"] = objProjeto;

           return RedirectToAction("Abrir");
       }

 

Ou quando você usa RedirectToAction(""); você pode usar TempData["key"] para salvar um objeto em uma sessão temporária que na sua forma padrão dura um redirecionamento.

 

Já sobre a atualização do objeto você pode fazer assim:

  //Projetos objProjeto = db.Projetos.Find(objP.idProjeto);
  objProjeto.Tabelas.Add(new Tabelas {NomeTabela = "Teste", Descricao = "Novo teste"});
  db.Entry(objProjeto).State = EntityState.Modified;
  db.SaveChanges();

 

Não lembro se já cheguei a usar isso, você precisaria testar.

Você pode ver mais aqui: CRUD ASP NET MVC

 

Espero que ajude.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.