Entity Framework многие ко многим продолжает добавлять дополнительные записи - PullRequest
1 голос
/ 11 апреля 2011

Я пытаюсь добавить новую запись в таблицу ссылок, используя код entityframework. У меня есть много ко многим на User и Role. У меня есть сценарий, который заключается в том, что, когда я меняю роль для пользователя, я удаляю все его предыдущие роли и добавляю новые роли следующим образом:

//Delete all associated roles for user
var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId);
var usersRoles = roleUser.Roles;

usersRoles.ForEach(role => roleUser.Roles.Remove(role));

//add the new roles
roleUser.Roles.AddRange(detachedUser.Roles);

db.SaveChanges();

Так что он удаляет их идеально. Но при добавлении новых ролей он добавляет не только таблицу ссылок, но и таблицу Role. Абсолютно новая роль добавляется без RoleName. user.Roles будет содержать элемент со следующими данными:

RoleId;//1 <-- this Id exists in the database already but yet still it creates one instead of a linktable record.
RoleName;//null

Как запретить EF добавлять целую новую запись и просто добавлять запись в таблицу ссылок?

Обновление: Я закончил тем, что сделал:

var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId);
var roles = db.Roles;

foreach (var role in roles)
{
     if (user.Roles.Any(r => r.RoleId == role.RoleId))
     {
          roleUser.Roles.Add(role);
     }
     else
     {
         roleUser.Roles.Remove(role);
     }
}
db.SaveChanges();

Ответы [ 3 ]

2 голосов
/ 11 апреля 2011

попробуйте сохранить перед добавлением новых ролей для пользователя

//Delete all associated roles for user 
var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId); 
var usersRoles = roleUser.Roles; 

usersRoles.ForEach(role => roleUser.Roles.Remove(role));  
db.SaveChanges(); 

roleUser.Roles.AddRange(user.Roles); //add the new roles 
db.SaveChanges(); 

Редактировать:

Взгляните на это:

roleUser.Roles.AddRange(user.Roles); //add the new roles 

где сделать user.Rolesоткуда?

1 голос
/ 11 апреля 2011

Думаю, у вас проблема в том, что вам нужно прикрепить свои роли, прежде чем добавлять их к пользователю.

Вам также не нужно удалять их все, просто удалите все удаленные и добавьте только новые.

0 голосов
/ 11 апреля 2011

Для каждого добавляемого вами броска вы можете попробовать проверить или установить состояние объекта. Например, здесь я установил набор для unchaged. Таким образом, он не будет пытаться вставить или обновить его.

myContext.Entry(roll).State = EntityState.Unchanged

Больше информации здесь: http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...