I have a N: N relationship between Activity and Project, where an activity has many projects:
public class Atividade : ObjetoPersistente
{
public Atividade()
{
StatusAtividade = EStatusAtividade.NaoIniciado;
TipoAtividade = ETipoAtividade.NovaImplementacao;
Usuario = new Usuario();
Projetos = new List<Projeto>();
}
[JsonConverter(typeof(FormatoDataHoraMinutoNullableConverter))]
public DateTime? DataHoraFim { get; set; }
[JsonConverter(typeof(FormatoDataHoraMinutoNullableConverter))]
public DateTime? DataHoraInicio { get; set; }
public string DescricaoAtividade { get; set; }
public string EstimativaInicialAtividade { get; set; }
public Usuario Usuario { get; set; }
public string LoginUsuario
{
get { return Usuario.Login; }
}
public EStatusAtividade StatusAtividade { get; set; }
public string DescricaoStatusAtividade
{
get { return StatusAtividade.Descricao; }
}
public string DescricaoTipoAtividade
{
get { return TipoAtividade.Descricao; }
}
public ETipoAtividade TipoAtividade { get; set; }
public string TituloAtividade { get; set; }
public long CodigoUsuario
{
get { return Usuario.Codigo; }
set { Usuario.Codigo = value; }
}
public List<Projeto> Projetos { get; set; }
public List<long> CodigoProjetos
{
get { return ObtenhaListaDeCodigosPorListaDeObjetos(Projetos); }
set { Projetos = ObtenhaListaDeObjetoPorListaDeCodigos<Projeto>(value); }
}
public override bool Equals(object obj)
{
return (obj is Atividade) && (obj as Atividade).Codigo.Equals(Codigo);
}
public override int GetHashCode()
{
return Codigo.GetHashCode();
}
}
Project:
public class Projeto : ObjetoPersistente, IObjetoElementoOption
{
public string Nome { get; set; }
public override bool Equals(object obj)
{
return (obj is Projeto) && (obj as Projeto).Codigo.Equals(Codigo);
}
public override int GetHashCode()
{
return Codigo.GetHashCode();
}
public string Valor
{
get { return Codigo.ToString(); }
}
public string Descricao {
get { return Nome; }
}
}
The mappings look like this:
public AtividadeMap()
{
HasKey(a => a.Codigo);
ToTable("tb_atividade");
Property(a => a.TituloAtividade).HasColumnName("titulo_atividade");
Property(a => a.DescricaoAtividade).HasColumnName("descricao_atividade");
Property(a => a.DataHoraInicio).HasColumnName("data_hora_inicio");
Property(a => a.DataHoraFim).HasColumnName("data_hora_fim");
Property(a => a.Codigo).HasColumnName("pk_atividade");
Property(a => a.StatusAtividade.Identificador).HasColumnName("status_atividade");
Property(a => a.EstimativaInicialAtividade).HasColumnName("estimativa_inicial_atividade");
Property(a => a.TipoAtividade.Identificador).HasColumnName("tipo_atividade");
Property(a => a.CodigoUsuario).HasColumnName("fk_usuario");
HasRequired(a => a.Usuario)
.WithMany()
.HasForeignKey(a => a.CodigoUsuario);
HasMany(a => a.Projetos)
.WithMany()
.Map(pa =>
{
pa.MapLeftKey("fk_atividade");
pa.MapRightKey("fk_projeto");
pa.ToTable("tb_atividade_projeto");
});
}
public class ProjetoMap : EntityTypeConfiguration<Projeto>
{
public ProjetoMap()
{
HasKey(a => a.Codigo);
ToTable("tb_projeto");
Property(p => p.Codigo).HasColumnName("pk_projeto");
Property(a => a.Nome).HasColumnName("nome");
}
}
The query process is OK, however, inclusions and changes do not work.
What's missing?
After searching on the subject, I found several answers like this, which in summary, in my situation, I would have to load each Project from the list of the Activity object to perform a Attach in the context class:
a>Is this the only way to perform an update in the situation of many-to-many relationships? Could you make the persistence of these relationships generic?