Em termos de entidades (ou objetos), você tem um Class
objeto que possui uma coleção de Students
e um Student
objeto que possui uma coleção de Classes
. Como sua StudentClass
tabela contém apenas os Ids e nenhuma informação extra, o EF não gera uma entidade para a tabela de junção. Esse é o comportamento correto e é o que você espera.
Agora, ao fazer inserções ou atualizações, tente pensar em termos de objetos. Por exemplo, se você deseja inserir uma classe com dois alunos, crie o Class
objeto, os Student
objetos, adicione os alunos à Students
coleção da classe, adicione o Class
objeto ao contexto e chame SaveChanges
:
using (var context = new YourContext())
{
var mathClass = new Class { Name = "Math" };
mathClass.Students.Add(new Student { Name = "Alice" });
mathClass.Students.Add(new Student { Name = "Bob" });
context.AddToClasses(mathClass);
context.SaveChanges();
}
Isso criará uma entrada na Class
tabela, duas entradas na Student
tabela e duas entradas na StudentClass
tabela ligando-as.
Você basicamente faz o mesmo para atualizações. Basta buscar os dados, modificar o gráfico adicionando e removendo objetos de coleções, chamar SaveChanges
. Verifique esta questão semelhante para obter detalhes.
Editar :
De acordo com seu comentário, você precisa inserir um novo Class
e adicionar dois existentes Students
a ele:
using (var context = new YourContext())
{
var mathClass= new Class { Name = "Math" };
Student student1 = context.Students.FirstOrDefault(s => s.Name == "Alice");
Student student2 = context.Students.FirstOrDefault(s => s.Name == "Bob");
mathClass.Students.Add(student1);
mathClass.Students.Add(student2);
context.AddToClasses(mathClass);
context.SaveChanges();
}
Como os dois alunos já estão no banco de dados, eles não serão inseridos, mas como agora estão na Students
coleção de Class
, duas entradas serão inseridas na StudentClass
tabela.
Experimente este para atualizar:
fonte
Eu queria adicionar minha experiência nisso. Na verdade, EF, quando você adiciona um objeto ao contexto, ele altera o estado de todos os filhos e entidades relacionadas para Adicionado. Embora haja uma pequena exceção na regra aqui: se as entidades filhas / relacionadas estão sendo rastreadas pelo mesmo contexto, EF entende que essas entidades existem e não as adiciona. O problema acontece quando, por exemplo, você carrega os filhos / entidades relacionadas de algum outro contexto ou uma interface de usuário da web etc e então sim, EF não sabe nada sobre essas entidades e vai e adiciona todas elas. Para evitar isso, basta pegar as chaves das entidades e localizá-las (por exemplo,
context.Students.FirstOrDefault(s => s.Name == "Alice"))
no mesmo contexto em que deseja fazer a adição.fonte
Eu uso a seguinte maneira para lidar com o relacionamento muitos-para-muitos onde apenas as chaves estrangeiras estão envolvidas.
Portanto, para inserir :
Para deletar ,
fonte
Na estrutura da entidade, quando o objeto é adicionado ao contexto, seu estado muda para Adicionado. EF também altera o estado de cada objeto para adicionado na árvore de objetos e, portanto, você está obtendo um erro de violação de chave primária ou registros duplicados são adicionados à tabela.
fonte