Я использую 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);
Все вышеперечисленное сработало частично. Какова лучшая практика для достижения этого?
Любая помощь будет оценена.
Спасибо,
К. Митев