How to instantiate primary key in another MVC class?

2

I have class Funcionario and Projeto . Both have their Id's.

I want to create a class ProjetoFuncionario and would like to instantiate the primary key of the two in this class.

How can I do it?

namespace Exercicio1.Models
{
    public class Projeto
    {
        public long id_Projeto { get; set; }
        public string nome_Projeto { get; set; }

        public List<FuncionarioModel> listaProjeto = new List<FuncionarioModel>();
    }
}

And also the class Funcionario :

public class FuncionarioModel
{
    string dataAtual = DateTime.Now.Day.ToString();

    public long id_funcionario { get; set; }
    [Required]

    [DisplayName(" Nome.: ")]
    [StringLength(40, ErrorMessage = " O Campo Nome permite apenas 40 caracteres!")]
    public string nom_funcionario { get; set; }
    [Required]
}
    
asked by anonymous 14.11.2014 / 14:46

2 answers

2
  

I want to create a class ProjectFunctional ...

There is no need to create a class like EmployeeProject to express these relationships. This usually occurs when creating the database tables, so you create a table to express the relationship, but the modeling of your objects will not look exactly as you model your database.

You can only work with the Funcionario (or FuncionarioModel as you called) classes and the same project.

  

... I would like to instantiate the primary key of the two in this class. How can I do it?

Actually you do not instantiate primary key because primary key is related to field (s) of object (s). As you know, you create instances of objects (such as Employee , Project , etc ...).

You can create the instance of class Projeto , create the instance (s) of the Project Employee (s), and add each Funcionario object to the list. When you save the Project to the database, the framework you use (Entity Framework, NHibernate, etc ...) will associate (saving the information in the tables Projeto , Funcionario and ProjetoFuncionario and even generating the Ids automatically) for you.

//Instancia os objetos para exemplificar
Projeto projeto_novo = new Projeto() { nome_Projeto = "Projeto 1", lista_funcionarios = new List<Funcionario>() };
Funcionario funcionario_novo1 = new Funcionario() { nom_funcionario = "Funcionário 1" };
Funcionario funcionario_novo2 = new Funcionario() { nom_funcionario = "Funcionário 2" };

//Adiciona os funcionários na lista
projeto_novo.lista_Funcionarios.Add(funcionario_novo1);
projeto_novo.lista_Funcionarios.Add(funcionario_novo2);

14.11.2014 / 15:54
1

Only by completing @Renan's response, in its modeling a Funcionario can belong to only Projeto and Projeto has several Funcionario s. In another interpretation of your question, you might want a Funcionario to have multiple Projeto s, and a Projeto may have several Funcionario s (cardinality N to N). In this case, a ProjetoFuncionario entity is relevant as follows:

public class ProjetoFuncionario
{
    [Key]
    public int ProjetoFuncionarioId { get; set; }
    public int ProjetoId { get; set; }
    public int FuncionarioId { get; set; }

    public virtual Projeto Projeto { get; set; }
    public virtual Funcionario Funcionario { get; set; }
}

I would like to discuss the way you used to implement, as well as suggest some guidelines to make your project more organized:

namespace Exercicio1.Models
{
    [DisplayColumn("Nome")] // Esse atributo faz algumas configurações automáticas, como DropDowns, por exemplo.
    public class Projeto
    {
        [Key] // É boa prática anotar qual propriedade é chave primária.
        public long ProjetoId { get; set; } // O padrão do Entity Framework é ProjetoId ou apenas Id
        [Required] // Procure anotar campos não nulos como [Required], obrigatórios.
        public string Nome { get; set; }

        // Procure não instanciar propriedades de navegação; O Entity Framework faz isso pra você;
        // Não precisa limitar a coleção em List<>; Use ICollection<>, que permite mais recursos;
        // Procure anotar a propriedade de navegação com virtual para permitir herança.
        public virtual ICollection<ProjetoFuncionario> ProjetoFuncionarios { get; set; }
    }

    [DisplayColumn("Nome")]
    public class Funcionario
    {
        // Essa propriedade não tem necessidade de ficar aqui, então comentei.
        // public string dataAtual = DateTime.Now.Day.ToString();

        [Key]
        public long FuncionarioId { get; set; } // Novamente coloquei essa chave na convenção.
        [Required] // Atributos são sempre em cima da propriedade alvo, não embaixo como estava.
        [DisplayName(" Nome.: ")]
        [StringLength(40, ErrorMessage = "O Campo Nome permite apenas 40 caracteres!")]
        public string Nome { get; set; }

        public virtual ICollection<ProjetoFuncionario> ProjetoFuncionarios { get; set; }
    }
}
    
16.12.2014 / 15:34