La idea con Attach()
El método es que tiene una entidad que se sabe que está en la base de datos pero que no está siendo rastreada por este contexto, ¿verdad? Mi pregunta para usted es si está seguro de que este rol aquí:
Role r = new Role { ID = 1, Name = "Members" };
es algo que ya existe? Si no es así, no creo que lo que quieras hacer sea usar
ctx.Roles.Attach(r);
más bien es que escribirías:
ctx.Roles.Add(r);
y luego podrías darte la vuelta y escribir
User u = new User {
Login = login,
Password = password,
Status = 1,
};
ctx.Users.Add(u);
u.Roles.Add(r);
ctx.SaveChanges();
El problema que tiene su primer ejemplo es que este nuevo rol es realmente nuevo para la base de datos, por lo que adjuntarlo no es lo que le gustaría hacer, sino que le gustaría agregarlo.
Y la única llamada a ctx.SaveChanges()
debería funcionar bien aquí.