Pomysł z Attach()
metoda polega na tym, że masz jednostkę, o której wiadomo, że znajduje się w bazie danych, ale nie jest śledzona przez ten kontekst, prawda? Moje pytanie do ciebie brzmi, czy wiesz na pewno, że ta rola tutaj:
Role r = new Role { ID = 1, Name = "Members" };
czy coś już istnieje? Jeśli tak nie jest, nie sądzę, że chcesz użyć
ctx.Roles.Attach(r);
raczej piszesz:
ctx.Roles.Add(r);
a potem możesz się odwrócić i pisać
User u = new User {
Login = login,
Password = password,
Status = 1,
};
ctx.Users.Add(u);
u.Roles.Add(r);
ctx.SaveChanges();
Problem w twoim pierwszym przykładzie polega na tym, że ta nowa rola jest naprawdę nowa w bazie danych, więc dołączanie jej nie jest tym, co chcesz zrobić, a raczej chcesz ją dodać.
I pojedyncze wywołanie ctx.SaveChanges()
powinno tu działać dobrze.