Nápad s Attach()
metoda je, že máte entitu, o které je známo, že je v DB, ale není sledována tímto kontextem, že? Moje otázka na vás zní, zda jistě víte, že tato role zde:
Role r = new Role { ID = 1, Name = "Members" };
je něco, co už existuje? Pokud ne, nemyslím si, že byste chtěli použít
ctx.Roles.Attach(r);
spíše je to tak, že byste napsali:
ctx.Roles.Add(r);
a pak se můžete otočit a psát
User u = new User {
Login = login,
Password = password,
Status = 1,
};
ctx.Users.Add(u);
u.Roles.Add(r);
ctx.SaveChanges();
Problém vašeho prvního příkladu je ten, že tato nová role je v DB skutečně nová, takže její připojení není to, co byste chtěli udělat, spíše byste ji chtěli přidat.
A jediné volání ctx.SaveChanges()
by zde mělo fungovat dobře.