A ideia com o
Attach()
método é que você tem uma entidade que é conhecida por estar no banco de dados, mas não está sendo rastreada por esse contexto, certo? Minha pergunta para você é se você tem certeza de que esse papel aqui:Role r = new Role { ID = 1, Name = "Members" };
é algo que já existe? Se isso não acontecer, eu não acho que o que você quer fazer é usar
ctx.Roles.Attach(r);
antes é que você escreveria:
ctx.Roles.Add(r);
e então você poderia virar e escrever
User u = new User {
Login = login,
Password = password,
Status = 1,
};
ctx.Users.Add(u);
u.Roles.Add(r);
ctx.SaveChanges();
O problema do seu primeiro exemplo é que essa nova função é realmente nova para o banco de dados, portanto, anexá-la não é o que você gostaria de fazer, mas sim adicioná-la.
E a única chamada para
ctx.SaveChanges()
deve funcionar bem aqui.