LINQ to SQL не получает правильные данные - PullRequest
2 голосов
/ 29 ноября 2011

Использование Studio 2008, C #, SQL Server 2005, Winforms.Я просмотрел весь этот сайт и не могу найти такую ​​же ситуацию ...

У меня заполнено окно data1 из соединения LINQ to SQL.Я нажимаю кнопку, чтобы открыть окно data2 и редактировать данные там.Когда я закрываю окно data2, мне нужно обновить данные в окне data1.Поэтому я вызываю SQL Server с запросом через LINQ.Я не возвращаю новые данные, которые я только что сохранил из окна data2.Я возвращаю старые данные, которые уже были там.Есть идеи почему?Я проверил, что данные были сохранены в базе данных SQL, и она там есть.

Теперь, если я закрою окно data1 и снова открою его, правильные данные будут там.Но почему, когда я запрашиваю базу данных сразу после закрытия окна data2, данные в окне data1 не обновляются?

Код:

IEnumerable<tblConstructionRevision> newRev1 = (from y in DDBML.tblConstructionRevisions orderby y.RevDate descending, y.RevNo descending where y.DrawID == drawID select y);

Не имеет значения, вернусь ли я к FirstOrDefault илисписок.Я не могу вернуть его в список <>, потому что мне нужен весь набор данных.

Ответы [ 4 ]

4 голосов
/ 29 ноября 2011

Вам необходимо использовать Метод обновления контекста данных для аннулирования кэша.

4 голосов
/ 29 ноября 2011
2 голосов
/ 29 ноября 2011

Звучит так, будто вы держите DDBML в своей форме.Я думаю, что пока контекст открыт, он будет кэшировать отслеживаемые объекты.Вы должны использовать datacontext, затем удалить его и открыть новый, когда вам нужно.Смотрите это для более подробной информации о кешировании: http://blogs.msdn.com/b/dinesh.kulkarni/archive/2008/07/01/linq-to-sql-tips-9-understanding-datacontext-s-internal-caching.aspx

0 голосов
/ 09 января 2017

Если вы хотите только текущие данные, используйте MergeOption.NoTracking.Это означает, что они не хранятся в графиках, которые отслеживают обновления и удаления объектов в одном контексте.Если данные, которые вы читаете, уже обновлены в другом контексте, окне или приложении, этот метод гарантирует, что прочитанные вами данные будут актуальными.Следует отметить, что отключение отслеживания объектов также не позволит вам отправлять обновления в базу данных.Поэтому после прочтения вы должны поместить значение MergeOption в оригинал.

System.Data.Objects.MergeOption mergeOption = DDBML.tblConstructionRevisions.MergeOption;
DDBML.tblConstructionRevisions.MergeOption = System.Data.Objects.MergeOption.NoTracking;

var newRev1 = (from y in DDBML.tblConstructionRevisions 
     orderby y.RevDate descending, y.RevNo descending
     where y.DrawID == drawID select y);

DDBML.tblConstructionRevisions.MergeOption = mergeOption;

Или вы можете использовать метод ExecuteStoreQuery () и указать NoTracking в параметрах.Этого же эффекта можно достичь.

var newRev1=db.ExecuteStoreQuery<tblConstructionRevisions>(
   "SELECT * FROM tblConstructionRevisions y WHERE y.DrawID = @ID 
          order by y.RevDate desc, y.RevNo desc",
   "tblConstructionRevision",
   System.Data.Objects.MergeOption.NoTracking,
   new SqlParameter("@ID", drawID));

В Entity Framework 4.1 вы можете использовать новый метод AsNoTracking ():

var newRev1 = (from y in DDBML.tblConstructionRevisions.AsNoTracking() 
     orderby y.RevDate descending, y.RevNo descending
     where y.DrawID == drawID select y);

или

var newRev1 = (from y in DDBML.tblConstructionRevisions 
     orderby y.RevDate descending, y.RevNo descending
     where y.DrawID == drawID select y).AsNoTracking();

Что делает NoTracking

Entity Framework предоставляет ряд параметров настройки производительности, которые помогут вам оптимизировать производительность ваших приложений.Одним из таких параметров настройки является .AsNoTracking ().Эта оптимизация позволяет вам сказать Entity Framework, что он не отслеживает результаты запроса.Это означает, что Entity Framework не выполняет никакой дополнительной обработки или хранения объектов, возвращаемых запросом.Однако это также означает, что вы не можете обновить эти объекты, не подключая их к графику отслеживания.

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