ApplyPropertyИзменения и ссылки - PullRequest
1 голос
/ 15 июля 2009

Я задавал этот вопрос ранее, но мне кажется, что я сформулировал его неправильно, поэтому здесь попытка номер два. У меня есть следующий код:

public User EditUser(User userToEdit)
{
    //userToEdit contains values for eagerly loaded contacts entity

    User originalUser = (from u in _entities.UserSet.Include("contacts")
                                 where u.ID == userToEdit.ID
                                 select u).FirstOrDefault();

    _entities.ApplyPropertyChanges(originalUser.EntityKey.EntitySetName, userToEdit);
    _entities.SaveChanges();

    return userToEdit;            
}

Довольно прямо. Однако объект контактов не обновляется. Насколько я понимаю, активная загрузка добавляет объект в контекст данных, поэтому, когда ApplyPropertyChanges вызывается с отсоединенным userToEdit, изменения контактов в userToEdit будут применены к присоединенному объекту контактов. Чего мне не хватает?

1 Ответ

1 голос
/ 15 июля 2009

Да, это неприятный побочный эффект того, что называется " Независимые ассоциации "

В EF (по крайней мере, в 3.5 SP1) отношения не считаются частью сущности, то есть существуют независимые.

Это означает, что вызов ApplyPropertyChanges(...) влияет только на свойства, которые являются структурно частью сущности, а не на ссылки.

Так что вам нужно изменить свой код на это:

public User EditUser(User userToEdit){    
    //userToEdit contains values for eagerly loaded contacts entity    
    User originalUser = (from u in _entities.UserSet.Include("contacts")                                 
        where u.ID == userToEdit.ID                                 
        select u).FirstOrDefault();  

    _entities.ApplyPropertyChanges(originalUser.EntityKey.EntitySetName, userToEdit);  
    originalUser.Contacts = userToEdit.Contacts;
    _entities.SaveChanges();    
    return userToEdit;            
}

Предполагается, что userToEdit.Contacts является ссылкой (не коллекцией) и не является нулевым.

Надеюсь, это поможет Alex

PS В .NET 4.0 Beta2 то, что называется Ассоциации FK , исправит эту проблему и сделает так, чтобы ваш код работал.

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