Entity framework возвращает старое значение обновленного столбца

#c# #.net #entity-framework

#c# #.net #структура организации

Вопрос:

Я использую.Таким образом, у меня есть конечная точка, которая обновляет некоторые столбцы, а затем она должна создать объект JSON из 2 таблиц и вернуть его, содержащий обновленный столбец. Точно, у меня есть диаграмма, в которой есть атрибуты. Каждая диаграмма может иметь несколько атрибутов (представьте ее как таблицу sql со столбцами). Поток идет вот так:

 1. updateAttribute; 2. getDiagramIDs; 3. getDiagramDetails from DiagramIDs; 4. constructJSONObject from the diagramDetails and its attributes. Example of return JSON: {  DiagramID: 1  Attributes: [  {  AttributeID: 2  Description: 'test'  }  ...  ] }  

Мой класс для диаграммы-это:

 [Table("Diagram", Schema = "core")] public partial class Diagram: BaseEntity {  public Diagram()  {  Attribute = new HashSetlt;Attributegt;();  }  public long ID{ get; set; }  [InverseProperty("Entity")]  public virtual ICollectionlt;Attributegt; Attribute { get; set; } }  

Мой класс для атрибута-это:

 [Table("Attribute", Schema = "core")] public partial class Attribute : BaseEntity {  public long DiagramID { get; set; }  public long? ID{ get; set; }  public int ColumnOrder { get; set; } }    

Чтобы получить как информацию о диаграммах, так и информацию об атрибутах, я использую

 await _context.Diagram.Where(x =gt; diagramIDs.Contains(x.ID)).Include(x =gt; x.Attribute).ToListAsync();  

где diagramIDs приведен список диаграмм, которые я передаю как клиент. Это возвращает мне более старую версию атрибутов, т. е. возвращает мне Атрибуты, какими они были до обновления. Пример сценария:

 1. I edit the description to 'test123'; 2. Manually check in MSSQL, it is edited successfully; 3. await _context.Diagram.Where(x =gt; diagramIDs.Contains(x.ID)) .Include(x =gt; x.Attribute) .ToListAsync(); - returns me 'test' instead of 'test123' even tho 'test123' is stored in the database  and the update function was called far before this.  

У вас есть какие-либо идеи, в чем может быть причина такого поведения, и если кто-нибудь когда-либо сталкивался с этим, как я могу это решить? Может ли это быть await/async проблемой, скажем, параллелизма?

Комментарии:

1. Используете ли вы один и тот же DbContext экземпляр в своем приложении и обновляете столбец за пределами своего приложения?

2. Да, я использую то же DbContext самое . Что именно вы имеете в виду под outside of my application этим ? Тело запроса с новым Description приходит из моего клиентского приложения да, но затем я выполняю обновление в .NET

3. Я предполагаю, что это ASP.NET? Повторное использование одного и того же DbContext экземпляра во всем приложении не поддерживается и приведет к ошибкам. Вы должны настроить его как службу с «областью действия» и иметь по одному экземпляру на запрос.

4. DbContext Кэширует записи, которые он считывает (исключая запросы без отслеживания). Если вы прочитаете запись в экземпляре 1 , обновите ее в экземпляре 2 , а затем прочтете ее снова в экземпляре 1 , вы получите исходные значения, а не обновленные значения. Сделав его службой «с областью действия», вы будете использовать новый экземпляр для каждого запроса, который не будет иметь никаких кэшированных значений и должен возвращать обновленное значение, как и ожидалось.

5. Спасибо за ответ и краткое описание!