EF 4.3 Обновление отношения "многие ко многим" и "Соединительная таблица" - PullRequest
0 голосов
/ 23 марта 2012
public class User
{
    public int Id{ get; set; }
    public ICollection<UserAction> UserActions{ get; set; }
    public string Name{ get; set; }
}

public class Action
{
    public int Id{ get; set; }
    public string Name{ get; set; }
    public ICollection<UserAction> UserActions{ get; set; }
}

public UserAction
{
    public int Id{ get; set; }
    public User User{ get; set; }
    public Action Action{ get; set; }
    public int Type {get;set}       
}

и в классе хранилища

public void Update(User user,List<UserAction> actions)
{
    User entity = this.GetUser(user.Id);           
    entity.UserActions.Clear();
    entity.UserActions= actions;
    this.siteRepository.Update<SiteUser>(user);
    this.siteRepository.UnitOfWork.SaveChanges();
}

я получаю ошибку ниже как

Операция завершилась неудачно: отношение не может быть изменено, так как одно или несколько свойств внешнего ключа не могут иметь значение NULL. Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или не связанный объект должен быть удален.

Ответы [ 3 ]

2 голосов
/ 24 марта 2012

Вам понадобится нечто подобное, если вы хотите заменить существующую коллекцию UserActions в базе данных новой коллекцией, которую вы передаете в метод. Особенно необходимо удалить UserActions, которые были удалены из коллекции также из базы данных, поскольку очевидно, что связь требуется, и действия пользователя либо должны ссылаться на сущность пользователя, либо должны быть удалены (это то, что говорит исключение ):

User entity = context.Users.Include(u => u.UserActions)
    .Single(u => u.Id == user.Id);

context.Entry(entity).CurrentValues.SetValues(user);
foreach (var userAction in entity.UserActions.ToList())
    if (!user.UserActions.Any(ua => ua.Id == userAction.Id))
        context.UserActions.Remove(userAction);   // DELETE is important here!

foreach (var userAction in user.UserActions)
{
    var userActioninDB = entity.UserActions
        .SingleOrDefault(ua => ua.Id == userAction.Id);
    if (userActionInDB == null)
        entity.UserActions.Add(userActioninDB);
    else
        context.Entry(userActioninDB).CurrentValues.SetValues(userAction);
}

context.SaveChanges();

Вы должны перевести это в свою структуру хранилища.

1 голос
/ 24 марта 2012

Спасибо, Слаума, Решение

List<UserAction> actions = new List<UserAction>(user.UserActions.ToList());

foreach (var action in actions )
{
  Delete<UserAction>(action);
}
0 голосов
/ 23 марта 2012

Добавление коллекции Users в класс Action и Actions to User.Вы даже не можете отобразить таблицу UserAction, если пользователь и действие в паре уникальны для этой таблицы.

Я ответил точно так же: База данных сначала с таблицей мостов, как сохранить ее вне модели

...