#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. Спасибо за ответ и краткое описание!