Я написал приложение WPF, но у меня возникла проблема с обновлением данных, которые извлекаются из базы данных SQL Server.Обновление данных в EntityFramework
Я использую StructureMap для ввода зависимостей, а также для управления жизненным циклом DBContext. Это моя конфигурация StructureMap:
ObjectFactory.Container.Configure(cfg =>
{
cfg.For<IUnitOfWork>()
.LifecycleIs(new ThreadLocalStorageLifecycle())
.Use<DBContext>();
});
Но когда я редактирую запись из другого экземпляра приложения или из SQL Server непосредственно, клиент который принес запись до того, не может обновить себя и просто показать немодифицированную данные.
Я использовал .LifecycleIs (новый ThreadLocalStorageLifecycle()) иметь различный контекст в каждом потоке, чтобы очистить кэш EntityFramework, но он не работает.
Это мой Класс обслуживания:
public class DraftService : IDraftService
{
IUnitOfWork _uow;
IDbSet<Models.Draft> _draft;
public DraftService(IUnitOfWork uow)
{
_uow = uow;
_draft = _uow.Set<Models.Draft>();
}
public Models.Draft GetByID(long id)
{
return _draft.Find(id);
}
}
и я использую службу следующим образом:
public class Draft
{
private IUnitOfWork _uow;
private IDraftService _draftService;
public Draft(IUnitOfWork uow, IDraftService draftService)
{
_uow = uow;
_draftService = draftService;
}
public async Task<Models.Draft> GetByID(long id)
{
return await Task.Run(() => _draftService.GetByID(id));
}
}
Что не так? Почему он не обновляет данные?
Заранее спасибо.
Вы можете обернуть единицу работы на заводе и использовать ее в использовании (var uow = uowfactory.instance()) {// делаем что-то здесь // сохраняем в конце, чтобы сохранить данные.} Таким образом, вы не будет проблемы с кешем. или ошибки, которые могут возникнуть в результате использования одного и того же контекста для всей логики приложения. – Rugdr
Вы правы Rugdr. Проблема в том, как избавиться от контекста? Не следует ".LifecycleIs (новый ThreadLocalStorageLifecycle()) работает и обновляет контекст для каждого потока? –
Зависит от перезапуска приложения или нет. Думаю, в этом случае вам не следует использовать «AlwaysUnique» как время жизни. Таким образом, вам просто нужно вызовите Container.GetInstance(), чтобы получить новый/не кэшированный, уникальный контекст в базе данных. Должен также работать и поток. (но вам нужно будет получить новый экземпляр вашей службы каждый раз, когда вы хотите его обновить) –
Rugdr