Отменить изменения с помощью Entity Framework 4 POCO - PullRequest
3 голосов
/ 20 марта 2011

Я использую Entity Framework 4.0 POCO с WPF. У меня есть форма, отображающая пользователю объект со связями «многие ко многим», подобный следующему:

public class BPartner : BaseEntity
{
    public string Name 
    { 
        get { return name; } 
        set 
        { 
            if (name != value) 
            {
                name = bpartnerValidatorLight.ValidateName(value); 
                OnPropertyChanged("Name",true); 
            } 
        } 
    }
    public virtual ObservableCollection<BPAddress> BPAddresses { get; set; }

}

public class BPAddress : BaseEntity
{
    public string Line1 
    { 
        get 
        { 
            return line1; 
        } 
        set 
        { 
            if (line1 != value) 
            {
                line1 = bpAddressValidatorLight.ValidateLine1(value); 
                OnPropertyChanged("Line1",true); 
            } 
        } 
    }

    public virtual City City 
    { 
        get { return city; } 
        set 
        { 
            if (city != value) 
            {
                city = value; 
                OnPropertyChanged("City"); 
            } 
        } 
    }
}

Пользователь может добавлять и удалять адреса в коллекции BPAddresses и изменять «Имя» BPartner. Когда пользователь завершит изменение объекта BPArtner, он / она может нажать «Сохранить» или «Отмена». Проблема в том, что когда пользователь нажимает «Отмена», мне нужно сказать Entity Framework, чтобы отменить все изменения. Любой подход к обработке этого очень приветствуется, включая перезагрузку. Вот что я попробовал: 1. Откажитесь от objectContext, создайте новый контекст объекта и просто запросите базу данных, чтобы перезагрузить все заново. Проблема здесь в том, что Entity Framework кэширует вещи, а старые объекты остаются привязанными к старому контексту, и я получаю исключения, если пользователь нажимает кнопку отмены, затем редактирует снова и нажимает кнопку сохранения. 2.
repoBPartner.Refresh (п.н.);

       IQueryable<BPAddress> query = from e in addressRepo.AsQueryable()

                where e.BPartnerId == bp.Id
                select e;
        ObjectQuery<BPAddress> objectQuery = (ObjectQuery<BPAddress>)query;
        objectQuery.Include("City");
        objectQuery.Include("Country");
          ObjectResult<BPAddress> result =  (ObjectResult<BPAddress>)objectQuery.Execute(MergeOption.OverwriteChanges);
        bp.BPAddresses = new System.Collections.ObjectModel.ObservableCollection<BPAddress>(result.ToList<BPAddress>());

      The problem here is that "City" property does not get refreshed. 
 3. Tried: objectContext.LoadProperty(bp, "BPAddresses", MergeOption.OverwriteChanges);

Все вышеперечисленное сработало частично. Какова лучшая практика для достижения этого?

Любая помощь будет оценена.

Спасибо, К. Митев

1 Ответ

2 голосов
/ 20 марта 2011

EF не предлагает отбрасывать изменения.EF также не имеет кэш второго уровня, поэтому, как только вы расположите контекст с изменениями и создадите новый контекст для загрузки данных из базы данных, вы получите неизмененные данные.

Проблема здесь заключается в том, что кэши Entity Frameworkвещи и старые объекты остаются привязанными к старому контексту, и я получаю исключения, если пользователь нажимает кнопку отмены, затем редактирует снова и нажимает кнопку сохранения.

Когда пользователь нажимает кнопку отмены, вы должны выбросить все объекты, используемые в редактировании, вместе сих контекст.Эти объекты и контекст мертвы.После того, как пользователь снова нажмет кнопку «Изменить», вы должны снова загрузить все из базы данных.

Обновление свойств навигации работает не очень хорошо.Например, когда вы добавляете что-то в коллекцию навигации, оно никогда не будет удалено путем обновления из базы данных.

...