Идеята с Attach()
методът е, че имате обект, за който е известно, че е в БД, но не се проследява от този контекст, нали? Въпросът ми към вас е знаете ли със сигурност, че тази роля е тук:
Role r = new Role { ID = 1, Name = "Members" };
нещо, което вече съществува? Ако не стане, не мисля, че това, което искате да направите, е да използвате
ctx.Roles.Attach(r);
по-скоро ще пишете:
ctx.Roles.Add(r);
и тогава бихте могли да се обърнете и да напишете
User u = new User {
Login = login,
Password = password,
Status = 1,
};
ctx.Users.Add(u);
u.Roles.Add(r);
ctx.SaveChanges();
Проблемът, който има първият ви пример е, че тази нова роля е наистина нова за БД, така че прикачването й не е това, което бихте искали да правите, по-скоро бихте искали да я добавите.
И единственото извикване на ctx.SaveChanges()
би трябвало да работи добре тук.