Ý tưởng với Attach()
là bạn có một thực thể được biết là có trong DB nhưng không được theo dõi bởi ngữ cảnh này, phải không? Câu hỏi của tôi dành cho bạn là bạn có biết chắc rằng Vai trò này ở đây không:
Role r = new Role { ID = 1, Name = "Members" };
là một cái gì đó đã tồn tại? Nếu không, tôi không nghĩ bạn muốn làm gì là sử dụng
ctx.Roles.Attach(r);
đúng hơn là bạn nên viết:
ctx.Roles.Add(r);
và sau đó bạn có thể quay lại và viết
User u = new User {
Login = login,
Password = password,
Status = 1,
};
ctx.Users.Add(u);
u.Roles.Add(r);
ctx.SaveChanges();
Vấn đề mà ví dụ đầu tiên của bạn gặp phải là Vai trò mới này thực sự mới đối với DB nên việc gắn nó không phải là điều bạn muốn làm, thay vì bạn muốn Thêm nó.
Và một lệnh gọi tới ctx.SaveChanges()
sẽ hoạt động tốt ở đây.