L'idea con Attach()
il metodo è che hai un'entità che è nota per essere nel DB ma non viene tracciata da questo contesto, giusto? La mia domanda per te è:sai per certo che questo ruolo qui:
Role r = new Role { ID = 1, Name = "Members" };
è qualcosa che esiste già? In caso contrario, non credo che quello che vuoi fare sia usare
ctx.Roles.Attach(r);
piuttosto è che dovresti scrivere:
ctx.Roles.Add(r);
e poi potresti voltarti e scrivere
User u = new User {
Login = login,
Password = password,
Status = 1,
};
ctx.Users.Add(u);
u.Roles.Add(r);
ctx.SaveChanges();
Il problema del tuo primo esempio è che questo nuovo ruolo è davvero nuovo per il DB, quindi allegarlo non è quello che vorresti fare, piuttosto vorresti aggiungerlo.
E la singola chiamata a ctx.SaveChanges()
dovrebbe funzionare bene qui.