1

Возможно ли получить новое значение RowVersion с использованием одного и того же DbContext без перезагрузки объекта из базы данных?Получение нового значения RowVersion с использованием Entity Framework 6

Сценарий:

  • Загрузка данных в виде редактора
  • Сохранить новые значения
  • Строки в таблице обновляется, новое значение RowVersion генерируются
  • Однако спасенное лицо по-прежнему имеет место старое значение RowVersion, поэтому новое значение не может быть возвращено клиенту

Все параллелизм con Как правило, статьи о троллях касаются только предотвращения обновления (например, см. this). Однако в примере из статьи за успешным обновлением следует перенаправление на страницу, где сохраненный объект читается снова, и теперь он имеет новое значение RowVersion. Я бы хотел избежать этого перенаправления.

+3

Что-то не правильно. RewVersion следует обновлять автоматически без повторного запроса. Можете ли вы видеть в профилировщике SQL, что EF считывает значение? –

+0

перенаправляет на страницу индекса. Вы хотите этого избежать? Объект был обновлен до перенаправления, вам не о чем беспокоиться. Переадресация является частью шаблона PRG (POST-> Redirect-> Get), чтобы предотвратить двойную проводку. – Ronald

+0

@ Ronald, в моем конкретном случае я хотел бы избежать шаблона PRG. Это служба веб-API, и я хочу пропустить дополнительную поездку туда и обратно, чтобы получить новую версию. –

ответ

1

Благодаря grennis, я узнал об источнике своих проблем.

Я определил интерфейс и сущность как

public interface IRowVersion 
{ 
    // Attention: this will not be "inherited" by the implementing class !!! 
    [Timestamp] 
    byte[] VersionStamp { get; set; } 
} 

public class Directory : IRowVersion 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Title { get; set; } 
    public string Description { get; set; } 

    // If this attribute is missing here, then row version is used 
    // My initial version was without this attribute 
    [Timestamp] 
    public byte[] VersionStamp { get; set; } 
} 

В моей проблемной версии, я подумал, что имея атрибут свойства интерфейса достаточно. Однако атрибут должен быть явно применен к свойству объекта. В противном случае он вообще не будет использоваться (даже не как часть инструкции SQL-запроса обновления). Значение было обновлено только потому, что DB обновляет значение столбца автоматически и, конечно, при следующем чтении я получил новое значение.

не полностью связан с проблемой, но все же стоит отметить, ... Следующий действительно убийца особенность Ef6

ctx.Database.Log = s => Debug.Write(s); 

SQL Profiler, это было хорошо зная, что вы :-)